[FFmpeg-devel] [PATCH] avcodec: add IMM5 decoder

James Almer jamrial at gmail.com
Tue Jul 16 16:52:05 EEST 2019


On 7/16/2019 10:42 AM, Paul B Mahol wrote:
> On 7/16/19, James Almer <jamrial at gmail.com> wrote:
>> On 7/16/2019 9:19 AM, Paul B Mahol wrote:
>>> +    ret = avcodec_receive_frame(codec_avctx, frame);
>>> +    if (ret < 0)
>>> +        return ret;
>>
>> avcodec_receive_frame() can return EAGAIN when the packet was consumed
>> and there was no output, but you're using it within a decode2 API based
>> decoder, which in that scenario must return avpkt->size with got_frame == 0.
>>
>> Both h264 and hevc set AV_CODEC_CAP_DELAY, but by setting threads to 1
>> you may be effectively forcing a 1:1 input/output scenario. Did you make
>> sure no frames are lost at the end when decoding your samples, and that
>> this function isn't returning EAGAIN at any point?
> 
> It does not return EAGAIN for any sample that I have.

Ok, good, so by keeping threads to 1 it should be safe.

> 
>>
>>> +
>>> +    avctx->pix_fmt = codec_avctx->pix_fmt;
>>> +    avctx->width   = codec_avctx->width;
>>> +    avctx->height  = codec_avctx->height;
>>
>> coded_width/height as well. Or just use ff_set_dimensions().
>>
>> And what about other fields like sample_aspect_ratio, bit_rate, color
>> information?
> 
> All relevant stuff should be in AVFrame itself.
> I will add more of missing stuff you mentioned.
> 
>>
>>> +
>>> +    *got_frame = 1;
>>> +
>>> +    return avpkt->size;
>>> +}
>>> +
>>> +static av_cold int imm5_close(AVCodecContext *avctx)
>>> +{
>>> +    IMM5Context *ctx = avctx->priv_data;
>>> +
>>> +    avcodec_free_context(&ctx->h264_avctx);
>>> +    avcodec_free_context(&ctx->hevc_avctx);
>>> +
>>> +    return 0;
>>> +}
>>> +
>>> +AVCodec ff_imm5_decoder = {
>>> +    .name           = "imm5",
>>> +    .long_name      = NULL_IF_CONFIG_SMALL("Infinity IMM5"),
>>> +    .type           = AVMEDIA_TYPE_VIDEO,
>>> +    .id             = AV_CODEC_ID_IMM5,
>>> +    .init           = imm5_init,
>>> +    .decode         = imm5_decode_frame,
>>> +    .close          = imm5_close,
>>
>> Missing a flush callback.
> 
> And what would it do?

Call avcodec_flush_buffers() on both h264 and hevc contexts.

> 
>>
>>> +    .priv_data_size = sizeof(IMM5Context),
>>> +    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
>>> +                      FF_CODEC_CAP_INIT_CLEANUP,
>>
>> You could set DR1, and set both h264_avctx->get_buffer2 and
>> hevc_avctx->get_buffer2 to avctx->get_buffer2, i think.
>>
> 
> Will try.
> 
> 
>>
>>
>>> +};
>>> diff --git a/libavformat/riff.c b/libavformat/riff.c
>>> index e755ad8d5f..610974ebf0 100644
>>> --- a/libavformat/riff.c
>>> +++ b/libavformat/riff.c
>>> @@ -488,6 +488,7 @@ const AVCodecTag ff_codec_bmp_tags[] = {
>>>      { AV_CODEC_ID_AGM,          MKTAG('A', 'G', 'M', '6') },
>>>      { AV_CODEC_ID_AGM,          MKTAG('A', 'G', 'M', '7') },
>>>      { AV_CODEC_ID_LSCR,         MKTAG('L', 'S', 'C', 'R') },
>>> +    { AV_CODEC_ID_IMM5,         MKTAG('I', 'M', 'M', '5') },
>>>      { AV_CODEC_ID_NONE,         0 }
>>>  };
>>>
>>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> 



More information about the ffmpeg-devel mailing list