On Tue, May 31, 2016 at 10:13:40AM +0200, Matthieu Bouron wrote: > On Sun, May 29, 2016 at 10:15:44AM +0200, Matthieu Bouron wrote: > > On Fri, May 27, 2016 at 10:13:20AM +0200, Matthieu Bouron wrote: > > > From: Matthieu Bouron <matthieu.bou...@stupeflix.com> > > > > > > --- > > > libavcodec/mediacodecdec_h264.c | 61 > > > +++++++++++++++++++++++++---------------- > > > 1 file changed, 37 insertions(+), 24 deletions(-) > > > > > > diff --git a/libavcodec/mediacodecdec_h264.c > > > b/libavcodec/mediacodecdec_h264.c > > > index 2d1d525..7f764e9 100644 > > > --- a/libavcodec/mediacodecdec_h264.c > > > +++ b/libavcodec/mediacodecdec_h264.c > > > @@ -23,6 +23,7 @@ > > > #include <stdint.h> > > > #include <string.h> > > > > > > +#include "libavutil/avassert.h" > > > #include "libavutil/common.h" > > > #include "libavutil/fifo.h" > > > #include "libavutil/opt.h" > > > @@ -41,13 +42,11 @@ typedef struct MediaCodecH264DecContext { > > > > > > MediaCodecDecContext ctx; > > > > > > - AVBitStreamFilterContext *bsf; > > > + AVBSFContext *bsf; > > > > > > AVFifoBuffer *fifo; > > > > > > - AVPacket input_ref; > > > AVPacket filtered_pkt; > > > - uint8_t *filtered_data; > > > > > > } MediaCodecH264DecContext; > > > > > > @@ -156,8 +155,9 @@ static av_cold int > > > mediacodec_decode_close(AVCodecContext *avctx) > > > ff_mediacodec_dec_close(avctx, &s->ctx); > > > > > > av_fifo_free(s->fifo); > > > + av_bsf_free(&s->bsf); > > > > > > - av_bitstream_filter_close(s->bsf); > > > + av_packet_unref(&s->filtered_pkt); > > > > > > return 0; > > > } > > > @@ -211,12 +211,23 @@ static av_cold int > > > mediacodec_decode_init(AVCodecContext *avctx) > > > goto done; > > > } > > > > > > - s->bsf = av_bitstream_filter_init("h264_mp4toannexb"); > > > - if (!s->bsf) { > > > - ret = AVERROR(ENOMEM); > > > + const AVBitStreamFilter *bsf = > > > av_bsf_get_by_name("h264_mp4toannexb"); > > > + if(!bsf) { > > > + ret = AVERROR_BSF_NOT_FOUND; > > > goto done; > > > } > > > > > > + if ((ret = av_bsf_alloc(bsf, &s->bsf))) { > > > + goto done; > > > + } > > > + > > > + if (((ret = avcodec_parameters_from_context(s->bsf->par_in, avctx)) > > > < 0) || > > > + ((ret = av_bsf_init(s->bsf)) < 0)) { > > > + goto done; > > > + } > > > + > > > + av_init_packet(&s->filtered_pkt); > > > + > > > done: > > > if (format) { > > > ff_AMediaFormat_delete(format); > > > @@ -265,7 +276,9 @@ static int mediacodec_decode_frame(AVCodecContext > > > *avctx, void *data, > > > while (!*got_frame) { > > > /* prepare the input data -- convert to Annex B if needed */ > > > if (s->filtered_pkt.size <= 0) { > > > - int size; > > > + AVPacket input_pkt = { 0 }; > > > + > > > + av_packet_unref(&s->filtered_pkt); > > > > > > /* no more data */ > > > if (av_fifo_size(s->fifo) < sizeof(AVPacket)) { > > > @@ -273,22 +286,24 @@ static int mediacodec_decode_frame(AVCodecContext > > > *avctx, void *data, > > > ff_mediacodec_dec_decode(avctx, &s->ctx, frame, > > > got_frame, avpkt); > > > } > > > > > > - if (s->filtered_data != s->input_ref.data) > > > - av_freep(&s->filtered_data); > > > - s->filtered_data = NULL; > > > - av_packet_unref(&s->input_ref); > > > + av_fifo_generic_read(s->fifo, &input_pkt, sizeof(input_pkt), > > > NULL); > > > + > > > + ret = av_bsf_send_packet(s->bsf, &input_pkt); > > > + if (ret < 0) { > > > + return ret; > > > + } > > > + > > > + ret = av_bsf_receive_packet(s->bsf, &s->filtered_pkt); > > > + if (ret == AVERROR(EAGAIN)) { > > > + goto done; > > > + } > > > + > > > + /* h264_mp4toannexb is used here and does not require > > > flushing */ > > > + av_assert0(ret != AVERROR_EOF); > > > > > > - av_fifo_generic_read(s->fifo, &s->input_ref, > > > sizeof(s->input_ref), NULL); > > > - ret = av_bitstream_filter_filter(s->bsf, avctx, NULL, > > > - &s->filtered_data, &size, > > > - s->input_ref.data, > > > s->input_ref.size, 0); > > > if (ret < 0) { > > > - s->filtered_data = s->input_ref.data; > > > - size = s->input_ref.size; > > > + return ret; > > > } > > > - s->filtered_pkt = s->input_ref; > > > - s->filtered_pkt.data = s->filtered_data; > > > - s->filtered_pkt.size = size; > > > } > > > > > > ret = mediacodec_process_data(avctx, frame, got_frame, > > > &s->filtered_pkt); > > > @@ -298,7 +313,7 @@ static int mediacodec_decode_frame(AVCodecContext > > > *avctx, void *data, > > > s->filtered_pkt.size -= ret; > > > s->filtered_pkt.data += ret; > > > } > > > - > > > +done: > > > return avpkt->size; > > > } > > > > > > @@ -313,8 +328,6 @@ static void mediacodec_decode_flush(AVCodecContext > > > *avctx) > > > } > > > av_fifo_reset(s->fifo); > > > > > > - av_packet_unref(&s->input_ref); > > > - > > > av_init_packet(&s->filtered_pkt); > > > s->filtered_pkt.data = NULL; > > > s->filtered_pkt.size = 0; > > > > The above chunk has been updated locally with: > > - av_init_packet(&s->filtered_pkt); > > - s->filtered_pkt.data = NULL; > > - s->filtered_pkt.size = 0; > > + av_packet_unref(&s->filtered_pkt); > > Ping. >
If there is no objection, I will push the patchset in one day. Matthieu [...] _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel