[FFmpeg-devel] [PATCH 1/5] avformat/av1dec: Set position of AVPackets given to BSF
James Almer
jamrial at gmail.com
Sun Aug 22 17:12:28 EEST 2021
On 8/22/2021 8:20 AM, Andreas Rheinhardt wrote:
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> ---
> libavformat/av1dec.c | 44 +++++++++++++++-----------------------------
> 1 file changed, 15 insertions(+), 29 deletions(-)
>
> diff --git a/libavformat/av1dec.c b/libavformat/av1dec.c
> index f6c575069e..e021615c1f 100644
> --- a/libavformat/av1dec.c
> +++ b/libavformat/av1dec.c
> @@ -22,7 +22,6 @@
> #include "config.h"
>
> #include "libavutil/common.h"
> -#include "libavutil/fifo.h"
> #include "libavutil/opt.h"
> #include "libavcodec/av1_parse.h"
> #include "libavcodec/bsf.h"
> @@ -299,7 +298,6 @@ typedef struct ObuContext {
> const AVClass *class;
> AVBSFContext *bsf;
> AVRational framerate;
> - AVFifoBuffer *fifo;
> } ObuContext;
>
> //For low overhead obu, we can't foresee the obu size before we parsed the header.
> @@ -372,9 +370,6 @@ static int obu_probe(const AVProbeData *p)
> static int obu_read_header(AVFormatContext *s)
> {
> ObuContext *c = s->priv_data;
> - c->fifo = av_fifo_alloc(MAX_OBU_HEADER_SIZE);
> - if (!c->fifo)
> - return AVERROR(ENOMEM);
> return read_header(s, &c->framerate, &c->bsf, c);
> }
>
> @@ -383,37 +378,26 @@ static int obu_get_packet(AVFormatContext *s, AVPacket *pkt)
> ObuContext *c = s->priv_data;
> uint8_t header[MAX_OBU_HEADER_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
> int64_t obu_size;
> - int size = av_fifo_space(c->fifo);
> + int size;
> int ret, len, type;
>
> - av_fifo_generic_write(c->fifo, s->pb, size,
> - (int (*)(void*, void*, int))avio_read);
> - size = av_fifo_size(c->fifo);
> - if (!size)
> - return 0;
> -
> - av_fifo_generic_peek(c->fifo, header, size, NULL);
> + if ((ret = ffio_ensure_seekback(s->pb, MAX_OBU_HEADER_SIZE)) < 0)
> + return ret;
> + size = avio_read(s->pb, header, MAX_OBU_HEADER_SIZE);
> + if (size < 0)
> + return size;
>
> len = read_obu_with_size(header, size, &obu_size, &type);
> if (len < 0) {
> av_log(c, AV_LOG_ERROR, "Failed to read obu\n");
> return len;
> }
> + avio_seek(s->pb, -size, SEEK_CUR);
>
> - ret = av_new_packet(pkt, len);
> - if (ret < 0) {
> - av_log(c, AV_LOG_ERROR, "Failed to allocate packet for obu\n");
> - return ret;
> - }
> - size = FFMIN(size, len);
> - av_fifo_generic_read(c->fifo, pkt->data, size, NULL);
> - len -= size;
> - if (len > 0) {
> - ret = avio_read(s->pb, pkt->data + size, len);
> - if (ret != len) {
> - av_log(c, AV_LOG_ERROR, "Failed to read %d frome file\n", len);
> - return ret < 0 ? ret : AVERROR_INVALIDDATA;
> - }
> + ret = av_get_packet(s->pb, pkt, len);
> + if (ret != len) {
> + av_log(c, AV_LOG_ERROR, "Failed to get packet for obu\n");
> + return ret < 0 ? ret : AVERROR_INVALIDDATA;
> }
> return 0;
> }
> @@ -425,7 +409,10 @@ static int obu_read_packet(AVFormatContext *s, AVPacket *pkt)
>
> while (1) {
> ret = obu_get_packet(s, pkt);
> - if (ret < 0)
> + /* In case of AVERROR_EOF we need to flush the BSF. Conveniently
> + * obu_get_packet() returns a blank pkt in this case which
> + * can be used to signal that the BSF should be flushed. */
> + if (ret < 0 && ret != AVERROR_EOF)
> return ret;
> ret = av_bsf_send_packet(c->bsf, pkt);
> if (ret < 0) {
> @@ -448,7 +435,6 @@ static int obu_read_close(AVFormatContext *s)
> {
> ObuContext *c = s->priv_data;
>
> - av_fifo_freep(&c->fifo);
> av_bsf_free(&c->bsf);
> return 0;
> }
LGTM.
More information about the ffmpeg-devel
mailing list