Thanks for getting back to this decoder!

On Mon, Jan 21, 2013 at 08:25:39PM +0100, Jordi Ortiz wrote:
> ---
> Use VideoDSPContext.emulated_edge_mc() instead of ff_emultated_edge_mc_8()
> Use the ff_get_buffer() wrapper.
> 
>  Changelog                |    1 +
>  configure                |    1 +
>  doc/general.texi         |    5 +-
>  libavcodec/Makefile      |    3 +
>  libavcodec/allcodecs.c   |    1 +
>  libavcodec/dirac_arith.c |  115 +++
>  libavcodec/dirac_arith.h |  166 ++++
>  libavcodec/diracdec.c    | 2014 
> ++++++++++++++++++++++++++++++++++++++++++++++
>  libavcodec/version.h     |    2 +-
>  9 files changed, 2305 insertions(+), 3 deletions(-)
>  create mode 100644 libavcodec/dirac_arith.c
>  create mode 100644 libavcodec/dirac_arith.h
>  create mode 100644 libavcodec/diracdec.c

What is the status of this decoder now?  Does it still produce artifacts?
If yes, for which cases?

> --- a/Changelog
> +++ b/Changelog
> @@ -16,6 +16,7 @@ version 9_beta3:
>  - multi-channel ALAC encoding up to 7.1
>  - TAK demuxer, parser, and decoder
>  - adaptive frame-level multithreading for H.264
> +- Native dirac decoder

native

> --- a/libavcodec/allcodecs.c
> +++ b/libavcodec/allcodecs.c
> @@ -120,6 +120,7 @@ void avcodec_register_all(void)
>      REGISTER_DECODER(CSCD,              cscd);
>      REGISTER_DECODER(CYUV,              cyuv);
>      REGISTER_DECODER(DFA,               dfa);
> +    REGISTER_DECODER (DIRAC, dirac);
>      REGISTER_ENCDEC (DNXHD,             dnxhd);
>      REGISTER_ENCDEC (DPX,               dpx);
>      REGISTER_DECODER(DSICINVIDEO,       dsicinvideo);

Keep this neatly aligned like the rest.

> --- /dev/null
> +++ b/libavcodec/dirac_arith.h
> @@ -0,0 +1,166 @@
> +
> +#ifndef AVCODEC_DIRAC_ARITH_H
> +#define AVCODEC_DIRAC_ARITH_H
> +
> +#include "bytestream.h"
> +#include "get_bits.h"

This does not appear to use anything from get_bits.h.

> --- /dev/null
> +++ b/libavcodec/diracdec.c
> @@ -0,0 +1,2014 @@
> +
> +static void dirac_decode_flush(AVCodecContext *avctx)
> +{
> +    DiracContext *s = avctx->priv_data;
> +    free_sequence_buffers(s);
> +    s->seen_sequence_header = 0;
> +    s->frame_number         = -1;
> +}
> +
> +static av_cold int dirac_decode_end(AVCodecContext *avctx)
> +{
> +    dirac_decode_flush(avctx);
> +    return 0;
> +}

Why the indirection?

> +/* [DIRAC_STD] 11.2 Picture prediction data. picture_prediction()
> + * Unpack the motion compensation parameters. */
> +static int dirac_unpack_prediction_parameters(DiracContext *s)
> +{
> +    if (FFMAX(s->plane[0].xblen, s->plane[0].yblen) > DIRAC_MAX_BLOCKSIZE) {
> +        av_log(s->avctx, AV_LOG_ERROR, "Unsupported large block size\n");
> +        return AVERROR_PATCHWELCOME;

Is this a candidate for av_log_missing_feature or av_log_patch_welcome?

> +/* [DIRAC_STD] 11.1.1 Picture Header. picture_header() */
> +static int dirac_decode_picture_header(DiracContext *s)
> +{
> +    int retire, picnum;
> +    int i, j, refnum, refdist, ret, distance;
> +    GetBitContext *gb = &s->gb;
> +
> +    /* [DIRAC_STD] 11.1.1 Picture Header. picture_header() PICTURE_NUM */
> +    picnum =
> +    s->current_picture->avframe.display_picture_number =
> +        get_bits_long(gb, 32);
> +    picnum = s->current_picture->avframe.display_picture_number = 
> get_bits_long(gb, 32);

nit:

    picnum                                             =
    s->current_picture->avframe.display_picture_number = get_bits_long(gb, 32);

> +        /* if there were no references at all, allocate one */
> +        if (!s->ref_pics[i])
> +            for (j = 0; j < DIRAC_MAX_FRAMES; j++)
> +                if (!s->all_frames[j].avframe.data[0]) {
> +                    s->ref_pics[i] = &s->all_frames[j];
> +                    if (ff_get_buffer(s->avctx, &s->ref_pics[i]->avframe) < 
> 0) {
> +                        av_log(s->avctx, AV_LOG_ERROR,
> +                               "Unable to allocate new frame\n");
> +                        return AVERROR_BUG;

Propagate the return value instead.

> +static int dirac_decode_data_unit(AVCodecContext *avctx, const uint8_t *buf,
> +                                  int size)
> +{
> +        if (ff_get_buffer(avctx, &pic->avframe) < 0) {
> +            av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
> +            return AVERROR_BUG;

same

Please check if there are more instances of ff_get_buffer that I missed.

> +static int dirac_decode_frame(AVCodecContext *avctx, void *data,
> +                              int *data_size, AVPacket *pkt)
> +{
> +    DiracContext *s     = avctx->priv_data;
> +    DiracFrame *picture = data;
> +    uint8_t *buf        = pkt->data;
> +    int buf_size        = pkt->size;
> +    int i, data_unit_size, ret, buf_idx = 0;
> +
> +    /* release unused frames */
> +    for (i = 0; i < DIRAC_MAX_FRAMES; i++)
> +        if (s->all_frames[i].avframe.data[0]
> +            && !s->all_frames[i].avframe.reference) {

nit: Move the && to the previous line.

Diego
_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to