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

Anton Khirnov anton at khirnov.net
Tue Sep 1 14:43:34 EEST 2020


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

> +                        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

-- 
Anton Khirnov


More information about the ffmpeg-devel mailing list