X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=ffmpeg%2Flibavformat%2Favidec.c;h=78a6deae7d7a2ee6ca6f026a180d33ad8905d088;hb=8fd34b4a89bf48bd51f52d72b09a8ae21a73b1df;hp=5b260e254286911c288188ede56cfa449c101bbe;hpb=2ba45a602cbfa7b771effba9b11bb4245c21bc00;p=deb_ffmpeg.git diff --git a/ffmpeg/libavformat/avidec.c b/ffmpeg/libavformat/avidec.c index 5b260e2..78a6dea 100644 --- a/ffmpeg/libavformat/avidec.c +++ b/ffmpeg/libavformat/avidec.c @@ -756,6 +756,10 @@ static int avi_read_header(AVFormatContext *s) pal_size = FFMIN(pal_size, st->codec->extradata_size); pal_src = st->codec->extradata + st->codec->extradata_size - pal_size; + /* Exclude the "BottomUp" field from the palette */ + if (pal_src - st->codec->extradata >= 9 && + !memcmp(st->codec->extradata + st->codec->extradata_size - 9, "BottomUp", 9)) + pal_src -= 9; for (i = 0; i < pal_size / 4; i++) ast->pal[i] = 0xFFU<<24 | AV_RL32(pal_src+4*i); ast->has_pal = 1; @@ -992,7 +996,7 @@ fail: return 0; } -static int read_gab2_sub(AVStream *st, AVPacket *pkt) +static int read_gab2_sub(AVFormatContext *s, AVStream *st, AVPacket *pkt) { if (pkt->size >= 7 && pkt->size < INT_MAX - AVPROBE_PADDING_SIZE && @@ -1035,6 +1039,10 @@ static int read_gab2_sub(AVStream *st, AVPacket *pkt) goto error; ast->sub_ctx->pb = pb; + + if (ff_copy_whitelists(ast->sub_ctx, s) < 0) + goto error; + if (!avformat_open_input(&ast->sub_ctx, "", sub_demuxer, NULL)) { ff_read_packet(ast->sub_ctx, &ast->sub_pkt); *st->codec = *ast->sub_ctx->streams[0]->codec; @@ -1047,6 +1055,7 @@ static int read_gab2_sub(AVStream *st, AVPacket *pkt) return 1; error: + av_freep(&ast->sub_ctx); av_freep(&pb); } return 0; @@ -1086,7 +1095,7 @@ static AVStream *get_subtitle_pkt(AVFormatContext *s, AVStream *next_st, return sub_st; } -static int get_stream_idx(unsigned *d) +static int get_stream_idx(const unsigned *d) { if (d[0] >= '0' && d[0] <= '9' && d[1] >= '0' && d[1] <= '9') { @@ -1141,7 +1150,7 @@ start_sync: goto start_sync; } - n = avi->dv_demux ? 0 : get_stream_idx(d); + n = get_stream_idx(d); if (!((i - avi->last_pkt_pos) & 1) && get_stream_idx(d + 1) < s->nb_streams) @@ -1153,6 +1162,9 @@ start_sync: goto start_sync; } + if (avi->dv_demux && n != 0) + continue; + // parse ##dc/##wb if (n < s->nb_streams) { AVStream *st; @@ -1386,7 +1398,7 @@ FF_ENABLE_DEPRECATION_WARNINGS if (size < 0) av_free_packet(pkt); } else if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE && - !st->codec->codec_tag && read_gab2_sub(st, pkt)) { + !st->codec->codec_tag && read_gab2_sub(s, st, pkt)) { ast->frame_offset++; avi->stream_index = -1; ast->remaining = 0;