Message ID | 20200715083733.101880-6-sj.hc_Zhong@sjtu.edu.cn |
---|---|
State | Superseded |
Headers | show |
Series | [FFmpeg-devel,RFC,GSoC,v1,1/6] avformat/abr: Adaptive Bitrate support | expand |
Context | Check | Description |
---|---|---|
andriy/default | pending | |
andriy/make | fail | Make failed |
Hongcheng Zhong: > From: spartazhc <spartazhc@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@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
On Thu, 2020-07-16 at 18:11 +0200, Andreas Rheinhardt wrote: > Hongcheng Zhong: > > From: spartazhc <spartazhc@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@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
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) {