[FFmpeg-devel] [PATCH] wavdec: RIFX file format support

Reimar Döffinger Reimar.Doeffinger at gmx.de
Wed Dec 17 22:15:39 CET 2014


On Wed, Dec 17, 2014 at 11:55:17AM +0100, Thomas Volkert wrote:
> On 12/16/2014 08:36 AM, Reimar Döffinger wrote:
> >On Mon, Dec 15, 2014 at 10:24:55AM +0000, Carl Eugen Hoyos wrote:
> >>>       codec->sample_rate = avio_rl32(pb);
> >>>       codec->bit_rate    = avio_rl32(pb) * 8;
> >>>       codec->block_align = avio_rl16(pb);
> >>>+    if (big_endian) {
> >>>+        id                 = ntohs(id);
> >>>+        codec->channels    = ntohs(codec->channels);
> >>>+        codec->sample_rate = ntohl(codec->sample_rate);
> >>>+        codec->bit_rate    = ntohl(codec->bit_rate / 8) * 8;
> >>>+        codec->block_align = ntohs(codec->block_align);
> >>>+    }
> >>Instead please do:
> >>if (big_endian) {
> >>   id = avio_rb32(pb);
> >>   codec->channels = avio_rb32(pb);
> >>  ...
> >>} else {
> >>id = avio_rl32(pb);
> >>...
> >>}
> >Not sure this is a good idea, as it duplicates the code.
> >It might be better to use the if as-is, just replacing ntoh*
> >by av_bswap*.
> 
> I would prefer this version:
> if (!big_endian) {
>  avio_rl32()
> } else {
>  avio_rb32()
> }
> In case of big endianess, your idea (and my former solution) would need two
> instead of one updates per value

Why would that matter? Performance, especially for big-endian type is
hardly relevant.
Due to fewer branches it might actually give better performance for the
common case (but as said I don't think it matters).
It mostly avoids duplicating some actual code like the *8.
There are also other options to reduce the code size, though I am
sceptical if they are a good idea.
1) Macros like:
#define GET16(pb) (big_endian ? avio_rb16(pb) : avio_rl16(pb))
2) Functions that take an additional endian argument.


More information about the ffmpeg-devel mailing list