[FFmpeg-devel] [PATCH] OpenEXR decoder rev-19

Jimmy Christensen jimmy
Mon Sep 14 14:27:42 CEST 2009


On 2009-09-14 14:21, Reimar D?ffinger wrote:
> On Mon, Sep 14, 2009 at 01:59:57PM +0200, Jimmy Christensen wrote:
>>>> +    if (!strcmp(*buf, "R"))
>>>> +        s->red_channel = channel_iter;
>>>> +    if (!strcmp(*buf, "G"))
>>>> +        s->green_channel = channel_iter;
>>>> +    if (!strcmp(*buf, "B"))
>>>> +        s->blue_channel = channel_iter;
>>>> +
>>>> +    while (bytestream_get_byte(buf)&&   *buf<   channel_list_end)
>>>> +        continue; /* skip */
>>>> +
>>>> +    current_bits_per_color_id = bytestream_get_le32(buf);
>>>> +    if (current_bits_per_color_id>   2)
>>>> +        return -1;
>>>> +
>>>> +    if (channel_iter == s->red_channel   ||
>>>> +        channel_iter == s->green_channel ||
>>>> +        channel_iter == s->blue_channel) {
>>>> +        if (channel_iter == s->red_channel) {
>>>> +            s->bits_per_color_id  = current_bits_per_color_id;
>>>> +            s->channel_offsets[0] = *current_channel_offset;
>>>> +        }
>>>> +        if (channel_iter == s->green_channel)
>>>> +            s->channel_offsets[1] = *current_channel_offset;
>>>> +        if (channel_iter == s->blue_channel)
>>>> +            s->channel_offsets[2] = *current_channel_offset;
>>>> +    }
>>>> +    *current_channel_offset += bytes_per_color_table[current_bits_per_color_id];
>>>> +    *buf += 12;
>>>> +    return 1;
>>>
>>> You misunderstood my comment on that. All those comparisons against
>>> channel_iter are completely obfuscating things.
>>> I guess you could do something like:
>>>
>>> int channel_index = -1;
>>> if (!buf[1]) { // only handle 1-character channel strings so far
>>>       switch (buf[0]) {
>>>       case 'R': channel_index++;
>>>       case 'G': channel_index++;
>>>       case 'B': channel_index++;
>>>       }
>>> }
>>> [... while an current_bits_per_color_id as above ...]
>>> if (channel_index>= 0) {
>>>       s->bits_per_color_id  = current_bits_per_color_id;
>>>       s->channel_offsets[channel_index] = *current_channel_offset;
>>> }
>>> *current_channel_offset[... rest identical...]
>>>
>>> You do not need channel_iter, nor do you need s->red_channel etc.,
>>> though you might want to know if a channel is missing.
>>> You can either do that with a bit mask, or you could initialize
>>> channel_offsets to something certainly invalid like -1.
>>>
>>>
>>
>> IMHO that's optimizing a bit too much. With the current implementation
>> it would be much easier to have the decoder use channel names other than
>> just R, G and B. If eg. I wanted to expand the decoder to also decoder
>> left eye of a OpenSXR file (OpenEXR stereo file). Their names are
>> left.R, left.G and left.B. Optimizing for only 1 character channel names
>> seems a bit too much, especially since it's only in the header parser
>> and is that much speed important.
>
> Well you still got the basic idea. Except that you are suddenly using
> strncmp again instead of strcmp.

I wasn't sure if it was safe to use only strcmp. Will change it for next 
revision if more changes are needed. (otherwise just posting a new one 
with that change).




More information about the ffmpeg-devel mailing list