[FFmpeg-devel] [PATCH] avformat/wavdec: add support for chapters

Paul B Mahol onemda at gmail.com
Tue Sep 1 15:23:41 EEST 2020


On 9/1/20, Anton Khirnov <anton at khirnov.net> wrote:
> Quoting Paul B Mahol (2020-08-31 14:20:11)
>> Support parsing 'cue ' and 'adtl' chunks.
>>
>> Signed-off-by: Paul B Mahol <onemda at gmail.com>
>> ---
>>  libavformat/wavdec.c | 50 ++++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 50 insertions(+)
>
> Looks ok beyond some nits.
>
>>
>> diff --git a/libavformat/wavdec.c b/libavformat/wavdec.c
>> index 5b3c481421..545f04c742 100644
>> --- a/libavformat/wavdec.c
>> +++ b/libavformat/wavdec.c
>> @@ -500,6 +500,7 @@ static int wav_read_header(AVFormatContext *s)
>>              wav->smv_cur_pt = 0;
>>              goto break_loop;
>>          case MKTAG('L', 'I', 'S', 'T'):
>> +        case MKTAG('l', 'i', 's', 't'):
>>              if (size < 4) {
>>                  av_log(s, AV_LOG_ERROR, "too short LIST tag\n");
>>                  return AVERROR_INVALIDDATA;
>> @@ -507,6 +508,37 @@ static int wav_read_header(AVFormatContext *s)
>>              switch (avio_rl32(pb)) {
>>              case MKTAG('I', 'N', 'F', 'O'):
>>                  ff_read_riff_info(s, size - 4);
>> +                break;
>> +            case MKTAG('a', 'd', 't', 'l'):
>> +                if (s->nb_chapters > 0) {
>> +                    while (avio_tell(pb) < next_tag_ofs) {
>> +                        AVChapter *chapter = NULL;
>> +                        char cue_label[512];
>> +                        unsigned id, sub_size;
>> +
>> +                        if (avio_feof(pb))
>> +                            break;
>
> nit: would look better in the loop condition

Done.

>
>> +                        if (avio_rl32(pb) != MKTAG('l', 'a', 'b', 'l'))
>> +                            break;
>> +
>> +                        sub_size = avio_rl32(pb);
>> +                        if (sub_size < 5)
>> +                            break;
>> +                        id       = avio_rl32(pb);
>> +                        avio_get_str(pb, sub_size - 4, cue_label,
>> sizeof(cue_label));
>> +                        avio_skip(pb, avio_tell(pb) & 1);
>> +
>> +                        for (int i = 0; i < s->nb_chapters; i++) {
>> +                            if (s->chapters[i]->id == id) {
>> +                                chapter = s->chapters[i];
>> +                                break;
>> +                            }
>> +                        }
>> +                        if (chapter)
>> +                            av_dict_set(&chapter->metadata, "title",
>> cue_label, 0);
>
> nit: could be merged into the loop above

Done.

Also fixed size check to not ignore 4 read bytes, and applied.

Thanks.

>
> --
> Anton Khirnov
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-devel mailing list