[FFmpeg-devel] [PATCH v2] lavf/avienc: Use palette side data packet if available

Mats Peterson matsp888 at yahoo.com
Sun Feb 28 01:13:52 CET 2016


On 02/28/2016 12:34 AM, Reimar Döffinger wrote:

> On Sat, Feb 27, 2016 at 10:55:13PM +0100, Mats Peterson wrote:
>> -                if (!avist->hdr_pal_done) {
>> -                    int64_t cur_offset = avio_tell(pb);
>> -                    avio_seek(pb, avist->pal_offset, SEEK_SET);
>> -                    for (i = 0; i < pal_size; i++) {
>> -                        uint32_t v = AV_RL32(data + size - 4*pal_size + 4*i);
>> -                        avio_wl32(pb, v & 0xffffff);
>> -                    }
>> -                    avio_seek(pb, cur_offset, SEEK_SET);
>> -                    avist->hdr_pal_done++;
>> -                }
>
> Hadn't seen this before.
> In principle it is a bit unfortunate as it means that streaming via
> stdout is not possible.
> It should at least be suppressed when seeking the output stream
> is not possible.

Right. Good point.

>
>
>> +        for (i = 0; i < pkt->side_data_elems; i++) {
>> +            if (pkt->side_data[i].type == AV_PKT_DATA_PALETTE) {
>> +                pal = pkt->side_data[i].data;
>> +                break;
>> +            }
>> +        }
>
> av_frame_get_side_data

No frames available in a muxer (as far as I know). But thanks anyway...

>
>> -                    uint32_t v = AV_RL32(data + size - 4*pal_size + 4*i);
>> -                    avio_wb32(pb, v<<8);
>> +                    uint32_t v = AV_RL32(pal + 4*i);
>> +                    avio_wl32(pb, v & 0xffffff);
>
> You'll probably still need the if to use the one or the avio_w...
> depending on format.
> Unless it's possible to change the embedded format to match
> the side data one.
>

Don't know what you mean by "Probably still need the if".


>> +            for (i = 0; i < pal_size; i++) {
>> +                uint32_t v = AV_RL32(pal + 4*i);
>> +                avio_wb32(pb, v<<8);
>
> Why is the header format different? That seems a bit weird.
> _______________________________________________

The palette uses a RGBQUAD (BGRA) structure for the entries in the 
palette after the BITMAPINFOHEADER, but it uses an AVIPALCHANGE 
structure (RGBA) for those 'xxpc' chunks. It may seem a bit confusing, 
but I'm doing everything by the book. It's all in the AVI specification.

I should probably never have said "I'm new at this". I know the specs 
alright.

I still got no answer to why the packet data is sometimes zero bytes 
when doing stream copy, but I suppose Michael knows.

Mats



More information about the ffmpeg-devel mailing list