Message ID | AM7PR03MB6660CDD3E4BD9A771AB586808F9C9@AM7PR03MB6660.eurprd03.prod.outlook.com |
---|---|
State | Accepted |
Commit | a5ee1663270cd15fa4d5f40d384a8d9eab4f7218 |
Headers | show |
Series | [FFmpeg-devel,1/5] avformat/avformat: Add AVStream parameter to check_bitstream() sig | expand |
Context | Check | Description |
---|---|---|
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
andriy/make_ppc | success | Make finished |
andriy/make_fate_ppc | success | Make fate finished |
Andreas Rheinhardt: > For most check_bitstream() functions this just avoids having > to dereference s->streams[pkt->stream_index] themselves; but for > meta-muxers it will allow to forward the packet to stream with > a different stream_index (belonging to a different AVFormatContext) > without using a spare packet. > > Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> > --- > libavformat/avformat.h | 7 ++++++- > libavformat/dashenc.c | 12 +++++++----- > libavformat/flvenc.c | 4 ++-- > libavformat/latmenc.c | 4 ++-- > libavformat/matroskaenc.c | 4 ++-- > libavformat/movenc.c | 4 ++-- > libavformat/mpegtsenc.c | 4 ++-- > libavformat/mux.c | 2 +- > libavformat/rawenc.c | 12 ++++++------ > libavformat/segment.c | 10 ++++++---- > 10 files changed, 36 insertions(+), 27 deletions(-) > > diff --git a/libavformat/avformat.h b/libavformat/avformat.h > index 0343825aa0..75699f3a32 100644 > --- a/libavformat/avformat.h > +++ b/libavformat/avformat.h > @@ -322,6 +322,7 @@ > #include "libavformat/version.h" > > struct AVFormatContext; > +struct AVStream; > > struct AVDeviceInfoList; > struct AVDeviceCapabilitiesQuery; > @@ -623,9 +624,13 @@ typedef struct AVOutputFormat { > /** > * Set up any necessary bitstream filtering and extract any extra data needed > * for the global header. > + * > + * @note pkt might have been directly forwarded by a meta-muxer; therefore > + * pkt->stream_index as well as the pkt's timebase might be invalid. > * Return 0 if more packets from this stream must be checked; 1 if not. > */ > - int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt); > + int (*check_bitstream)(struct AVFormatContext *s, struct AVStream *st, > + const AVPacket *pkt); > } AVOutputFormat; > /** > * @} > diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c > index 5faf06e11d..dd2b34afbb 100644 > --- a/libavformat/dashenc.c > +++ b/libavformat/dashenc.c > @@ -2333,19 +2333,21 @@ static int dash_write_trailer(AVFormatContext *s) > return 0; > } > > -static int dash_check_bitstream(struct AVFormatContext *s, const AVPacket *avpkt) > +static int dash_check_bitstream(AVFormatContext *s, AVStream *st, > + const AVPacket *avpkt) > { > DASHContext *c = s->priv_data; > - OutputStream *os = &c->streams[avpkt->stream_index]; > + OutputStream *os = &c->streams[st->index]; > AVFormatContext *oc = os->ctx; > if (oc->oformat->check_bitstream) { > + AVStream *const ost = oc->streams[0]; > int ret; > AVPacket pkt = *avpkt; > pkt.stream_index = 0; > - ret = oc->oformat->check_bitstream(oc, &pkt); > + ret = oc->oformat->check_bitstream(oc, ost, &pkt); > if (ret == 1) { > - FFStream *const sti = ffstream(s->streams[avpkt->stream_index]); > - FFStream *const osti = ffstream(oc->streams[0]); > + FFStream *const sti = ffstream(st); > + FFStream *const osti = ffstream(ost); > sti->bsfc = osti->bsfc; > osti->bsfc = NULL; > } > diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c > index 3f24c7e192..c5926575a1 100644 > --- a/libavformat/flvenc.c > +++ b/libavformat/flvenc.c > @@ -1083,10 +1083,10 @@ fail: > return ret; > } > > -static int flv_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) > +static int flv_check_bitstream(AVFormatContext *s, AVStream *st, > + const AVPacket *pkt) > { > int ret = 1; > - AVStream *st = s->streams[pkt->stream_index]; > > if (st->codecpar->codec_id == AV_CODEC_ID_AAC) { > if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) > diff --git a/libavformat/latmenc.c b/libavformat/latmenc.c > index 21bb614f67..72865c9565 100644 > --- a/libavformat/latmenc.c > +++ b/libavformat/latmenc.c > @@ -245,10 +245,10 @@ too_large: > return AVERROR_INVALIDDATA; > } > > -static int latm_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) > +static int latm_check_bitstream(AVFormatContext *s, AVStream *st, > + const AVPacket *pkt) > { > int ret = 1; > - AVStream *st = s->streams[pkt->stream_index]; > > if (st->codecpar->codec_id == AV_CODEC_ID_AAC) { > if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) > diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c > index 6945c26f5a..f08ead0a96 100644 > --- a/libavformat/matroskaenc.c > +++ b/libavformat/matroskaenc.c > @@ -2731,10 +2731,10 @@ static int mkv_init(struct AVFormatContext *s) > return 0; > } > > -static int mkv_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) > +static int mkv_check_bitstream(AVFormatContext *s, AVStream *st, > + const AVPacket *pkt) > { > int ret = 1; > - AVStream *st = s->streams[pkt->stream_index]; > > if (st->codecpar->codec_id == AV_CODEC_ID_AAC) { > if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) > diff --git a/libavformat/movenc.c b/libavformat/movenc.c > index 37d4403f7a..fec467979a 100644 > --- a/libavformat/movenc.c > +++ b/libavformat/movenc.c > @@ -7343,10 +7343,10 @@ static int mov_write_trailer(AVFormatContext *s) > return res; > } > > -static int mov_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) > +static int mov_check_bitstream(AVFormatContext *s, AVStream *st, > + const AVPacket *pkt) > { > int ret = 1; > - AVStream *st = s->streams[pkt->stream_index]; > > if (st->codecpar->codec_id == AV_CODEC_ID_AAC) { > if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) > diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c > index e3fba54939..79ec1a7e5f 100644 > --- a/libavformat/mpegtsenc.c > +++ b/libavformat/mpegtsenc.c > @@ -2208,10 +2208,10 @@ static void mpegts_deinit(AVFormatContext *s) > av_freep(&ts->services); > } > > -static int mpegts_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) > +static int mpegts_check_bitstream(AVFormatContext *s, AVStream *st, > + const AVPacket *pkt) > { > int ret = 1; > - AVStream *st = s->streams[pkt->stream_index]; > > if (st->codecpar->codec_id == AV_CODEC_ID_H264) { > if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 && > diff --git a/libavformat/mux.c b/libavformat/mux.c > index 1389bcc003..d93dc73f8e 100644 > --- a/libavformat/mux.c > +++ b/libavformat/mux.c > @@ -1074,7 +1074,7 @@ static int check_bitstream(AVFormatContext *s, FFStream *sti, AVPacket *pkt) > > if (s->oformat->check_bitstream) { > if (!sti->bitstream_checked) { > - if ((ret = s->oformat->check_bitstream(s, pkt)) < 0) > + if ((ret = s->oformat->check_bitstream(s, &sti->pub, pkt)) < 0) > return ret; > else if (ret == 1) > sti->bitstream_checked = 1; > diff --git a/libavformat/rawenc.c b/libavformat/rawenc.c > index 15e7051873..4bbae7717b 100644 > --- a/libavformat/rawenc.c > +++ b/libavformat/rawenc.c > @@ -341,9 +341,9 @@ const AVOutputFormat ff_h263_muxer = { > #endif > > #if CONFIG_H264_MUXER > -static int h264_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) > +static int h264_check_bitstream(AVFormatContext *s, AVStream *st, > + const AVPacket *pkt) > { > - AVStream *st = s->streams[0]; > if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 && > AV_RB24(pkt->data) != 0x000001) > return ff_stream_add_bitstream_filter(st, "h264_mp4toannexb", NULL); > @@ -364,9 +364,9 @@ const AVOutputFormat ff_h264_muxer = { > #endif > > #if CONFIG_HEVC_MUXER > -static int hevc_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) > +static int hevc_check_bitstream(AVFormatContext *s, AVStream *st, > + const AVPacket *pkt) > { > - AVStream *st = s->streams[0]; > if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 && > AV_RB24(pkt->data) != 0x000001) > return ff_stream_add_bitstream_filter(st, "hevc_mp4toannexb", NULL); > @@ -468,9 +468,9 @@ const AVOutputFormat ff_mpeg2video_muxer = { > #endif > > #if CONFIG_OBU_MUXER > -static int obu_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) > +static int obu_check_bitstream(AVFormatContext *s, AVStream *st, > + const AVPacket *pkt) > { > - AVStream *st = s->streams[0]; > return ff_stream_add_bitstream_filter(st, "av1_metadata", "td=insert"); > } > > diff --git a/libavformat/segment.c b/libavformat/segment.c > index 2b024fd373..9861462405 100644 > --- a/libavformat/segment.c > +++ b/libavformat/segment.c > @@ -984,15 +984,17 @@ static int seg_write_trailer(struct AVFormatContext *s) > return ret; > } > > -static int seg_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) > +static int seg_check_bitstream(AVFormatContext *s, AVStream *st, > + const AVPacket *pkt) > { > SegmentContext *seg = s->priv_data; > AVFormatContext *oc = seg->avf; > if (oc->oformat->check_bitstream) { > - int ret = oc->oformat->check_bitstream(oc, pkt); > + AVStream *const ost = oc->streams[st->index]; > + int ret = oc->oformat->check_bitstream(oc, ost, pkt); > if (ret == 1) { > - FFStream *const sti = ffstream( s->streams[pkt->stream_index]); > - FFStream *const osti = ffstream(oc->streams[pkt->stream_index]); > + FFStream *const sti = ffstream(st); > + FFStream *const osti = ffstream(ost); > sti->bsfc = osti->bsfc; > osti->bsfc = NULL; > } > Will apply this patchset. - Andreas
diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 0343825aa0..75699f3a32 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -322,6 +322,7 @@ #include "libavformat/version.h" struct AVFormatContext; +struct AVStream; struct AVDeviceInfoList; struct AVDeviceCapabilitiesQuery; @@ -623,9 +624,13 @@ typedef struct AVOutputFormat { /** * Set up any necessary bitstream filtering and extract any extra data needed * for the global header. + * + * @note pkt might have been directly forwarded by a meta-muxer; therefore + * pkt->stream_index as well as the pkt's timebase might be invalid. * Return 0 if more packets from this stream must be checked; 1 if not. */ - int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt); + int (*check_bitstream)(struct AVFormatContext *s, struct AVStream *st, + const AVPacket *pkt); } AVOutputFormat; /** * @} diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index 5faf06e11d..dd2b34afbb 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -2333,19 +2333,21 @@ static int dash_write_trailer(AVFormatContext *s) return 0; } -static int dash_check_bitstream(struct AVFormatContext *s, const AVPacket *avpkt) +static int dash_check_bitstream(AVFormatContext *s, AVStream *st, + const AVPacket *avpkt) { DASHContext *c = s->priv_data; - OutputStream *os = &c->streams[avpkt->stream_index]; + OutputStream *os = &c->streams[st->index]; AVFormatContext *oc = os->ctx; if (oc->oformat->check_bitstream) { + AVStream *const ost = oc->streams[0]; int ret; AVPacket pkt = *avpkt; pkt.stream_index = 0; - ret = oc->oformat->check_bitstream(oc, &pkt); + ret = oc->oformat->check_bitstream(oc, ost, &pkt); if (ret == 1) { - FFStream *const sti = ffstream(s->streams[avpkt->stream_index]); - FFStream *const osti = ffstream(oc->streams[0]); + FFStream *const sti = ffstream(st); + FFStream *const osti = ffstream(ost); sti->bsfc = osti->bsfc; osti->bsfc = NULL; } diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c index 3f24c7e192..c5926575a1 100644 --- a/libavformat/flvenc.c +++ b/libavformat/flvenc.c @@ -1083,10 +1083,10 @@ fail: return ret; } -static int flv_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) +static int flv_check_bitstream(AVFormatContext *s, AVStream *st, + const AVPacket *pkt) { int ret = 1; - AVStream *st = s->streams[pkt->stream_index]; if (st->codecpar->codec_id == AV_CODEC_ID_AAC) { if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) diff --git a/libavformat/latmenc.c b/libavformat/latmenc.c index 21bb614f67..72865c9565 100644 --- a/libavformat/latmenc.c +++ b/libavformat/latmenc.c @@ -245,10 +245,10 @@ too_large: return AVERROR_INVALIDDATA; } -static int latm_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) +static int latm_check_bitstream(AVFormatContext *s, AVStream *st, + const AVPacket *pkt) { int ret = 1; - AVStream *st = s->streams[pkt->stream_index]; if (st->codecpar->codec_id == AV_CODEC_ID_AAC) { if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 6945c26f5a..f08ead0a96 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2731,10 +2731,10 @@ static int mkv_init(struct AVFormatContext *s) return 0; } -static int mkv_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) +static int mkv_check_bitstream(AVFormatContext *s, AVStream *st, + const AVPacket *pkt) { int ret = 1; - AVStream *st = s->streams[pkt->stream_index]; if (st->codecpar->codec_id == AV_CODEC_ID_AAC) { if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 37d4403f7a..fec467979a 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -7343,10 +7343,10 @@ static int mov_write_trailer(AVFormatContext *s) return res; } -static int mov_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) +static int mov_check_bitstream(AVFormatContext *s, AVStream *st, + const AVPacket *pkt) { int ret = 1; - AVStream *st = s->streams[pkt->stream_index]; if (st->codecpar->codec_id == AV_CODEC_ID_AAC) { if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index e3fba54939..79ec1a7e5f 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -2208,10 +2208,10 @@ static void mpegts_deinit(AVFormatContext *s) av_freep(&ts->services); } -static int mpegts_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) +static int mpegts_check_bitstream(AVFormatContext *s, AVStream *st, + const AVPacket *pkt) { int ret = 1; - AVStream *st = s->streams[pkt->stream_index]; if (st->codecpar->codec_id == AV_CODEC_ID_H264) { if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 && diff --git a/libavformat/mux.c b/libavformat/mux.c index 1389bcc003..d93dc73f8e 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -1074,7 +1074,7 @@ static int check_bitstream(AVFormatContext *s, FFStream *sti, AVPacket *pkt) if (s->oformat->check_bitstream) { if (!sti->bitstream_checked) { - if ((ret = s->oformat->check_bitstream(s, pkt)) < 0) + if ((ret = s->oformat->check_bitstream(s, &sti->pub, pkt)) < 0) return ret; else if (ret == 1) sti->bitstream_checked = 1; diff --git a/libavformat/rawenc.c b/libavformat/rawenc.c index 15e7051873..4bbae7717b 100644 --- a/libavformat/rawenc.c +++ b/libavformat/rawenc.c @@ -341,9 +341,9 @@ const AVOutputFormat ff_h263_muxer = { #endif #if CONFIG_H264_MUXER -static int h264_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) +static int h264_check_bitstream(AVFormatContext *s, AVStream *st, + const AVPacket *pkt) { - AVStream *st = s->streams[0]; if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 && AV_RB24(pkt->data) != 0x000001) return ff_stream_add_bitstream_filter(st, "h264_mp4toannexb", NULL); @@ -364,9 +364,9 @@ const AVOutputFormat ff_h264_muxer = { #endif #if CONFIG_HEVC_MUXER -static int hevc_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) +static int hevc_check_bitstream(AVFormatContext *s, AVStream *st, + const AVPacket *pkt) { - AVStream *st = s->streams[0]; if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 && AV_RB24(pkt->data) != 0x000001) return ff_stream_add_bitstream_filter(st, "hevc_mp4toannexb", NULL); @@ -468,9 +468,9 @@ const AVOutputFormat ff_mpeg2video_muxer = { #endif #if CONFIG_OBU_MUXER -static int obu_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) +static int obu_check_bitstream(AVFormatContext *s, AVStream *st, + const AVPacket *pkt) { - AVStream *st = s->streams[0]; return ff_stream_add_bitstream_filter(st, "av1_metadata", "td=insert"); } diff --git a/libavformat/segment.c b/libavformat/segment.c index 2b024fd373..9861462405 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -984,15 +984,17 @@ static int seg_write_trailer(struct AVFormatContext *s) return ret; } -static int seg_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) +static int seg_check_bitstream(AVFormatContext *s, AVStream *st, + const AVPacket *pkt) { SegmentContext *seg = s->priv_data; AVFormatContext *oc = seg->avf; if (oc->oformat->check_bitstream) { - int ret = oc->oformat->check_bitstream(oc, pkt); + AVStream *const ost = oc->streams[st->index]; + int ret = oc->oformat->check_bitstream(oc, ost, pkt); if (ret == 1) { - FFStream *const sti = ffstream( s->streams[pkt->stream_index]); - FFStream *const osti = ffstream(oc->streams[pkt->stream_index]); + FFStream *const sti = ffstream(st); + FFStream *const osti = ffstream(ost); sti->bsfc = osti->bsfc; osti->bsfc = NULL; }
For most check_bitstream() functions this just avoids having to dereference s->streams[pkt->stream_index] themselves; but for meta-muxers it will allow to forward the packet to stream with a different stream_index (belonging to a different AVFormatContext) without using a spare packet. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> --- libavformat/avformat.h | 7 ++++++- libavformat/dashenc.c | 12 +++++++----- libavformat/flvenc.c | 4 ++-- libavformat/latmenc.c | 4 ++-- libavformat/matroskaenc.c | 4 ++-- libavformat/movenc.c | 4 ++-- libavformat/mpegtsenc.c | 4 ++-- libavformat/mux.c | 2 +- libavformat/rawenc.c | 12 ++++++------ libavformat/segment.c | 10 ++++++---- 10 files changed, 36 insertions(+), 27 deletions(-)