[FFmpeg-devel] [RFC][GSoC][PATCH v1 6/6] ffplay: add av_packet_buffer_filter to filter packet buffer
Hongcheng Zhong
sj.hc_Zhong at sjtu.edu.cn
Sun Jul 19 14:41:19 EEST 2020
On Thu, 2020-07-16 at 18:11 +0200, Andreas Rheinhardt wrote:
> Hongcheng Zhong:
> > From: spartazhc <spartazhc at gmail.com>
> >
> > hls_read_header will add all streams to s->internal->packet_buffer.
> > Use av_packet_buffer_filter to remove the AVPackets from other
> > streams that
> > are not needed, otherwise abr will allow them to be added to
> > ffplay's
> > packet_queue.
> >
> > Signed-off-by: spartazhc <spartazhc at gmail.com>
> > ---
> > fftools/ffplay.c | 4 ++++
> > 1 file changed, 4 insertions(+)
> >
> > diff --git a/fftools/ffplay.c b/fftools/ffplay.c
> > index b17b75fa8f..832e97d910 100644
> > --- a/fftools/ffplay.c
> > +++ b/fftools/ffplay.c
> > @@ -3018,6 +3018,10 @@ static int read_thread(void *arg)
> >
> > /* clean packet list filled in hls_read_header if abr is
> > enabled */
> > if (abr) {
> > + ret = av_packet_buffer_filter(ic, st_index);
> > + if (ret < 0) {
> > + av_log(NULL, AV_LOG_WARNING, "Failed to clean
> > av_packet\n");
> > + }
> > is->abr_list = av_mallocz(sizeof(ABRList));
> > ret = abr_init_list(is);
> > if (ret < 0) {
> >
> Do we need this new function at all? Can't we not just set
> AVStream.discard to AVDISCARD_ALL for the streams we don't want and
> modify av_read_frame() to make sure that it never outputs packets
> belonging to a stream that ought to be discarded?
>
> - Andreas
> _______________________________________________
I am not sure if it can be done elegantly. Currently in ffplay, all
stream packets will be added to packet list in ffplay's
read_thread avformat_find_stream_info (all these are before
AVDISCARD_ALL are set to streams). After this, ffplay will call
av_find_best_stream() to decide which stream to be reserved.
I tried to setup AVDISCARD flags after hls_read_header(), which will
prevent av_read_frame() to read other streams. But there are 2 problems
1. I can use variant's bandwidth only to determine which one is the
best stream, not av_find_best_stream(). It will cause problem if two
results are different, so I even need to disable av_find_best_stream().
2. Will cause warning "Could not find codec parameters for stream 2
(Video: h264, 1 reference frame ([27][0][0][0] / 0x001B), none):
unspecified size Consider increasing the value for the analyzeduration'
(0) and 'probesize' (5000000) options".
I have considered about it when I added this API. Adding an API is an
easy way to fix the problem, but not good enough.
Really need your advice here.
Regards,
Hongcheng
More information about the ffmpeg-devel
mailing list