[FFmpeg-devel] [PATCH]Save properties of the decoded stream

wm4 nfxjfg at googlemail.com
Thu Jul 16 12:54:24 CEST 2015


On Thu, 16 Jul 2015 00:47:51 +0200
Carl Eugen Hoyos <cehoyos at ag.or.at> wrote:

> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 738f4db..c8b70d7 100644

Send a proper git patch. git has the format-patch feature for a reason.

> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -3173,6 +3173,16 @@ typedef struct AVCodecContext {
>       * - decoding: set by user through AVOPtions (NO direct access)
>       */
>      char *codec_whitelist;
> +
> +    /*
> +     * Properties of the stream that gets decoded
> +     * To be accessed through av_codec_get_properties() (NO direct access)

Create an internal context (like e.g. AVFormatContext does) or so to
store these fields, instead of adding this kind of semi-private fields
to a public struct.

> +     * - encoding: unused
> +     * - decoding: set by libavcodec
> +     */
> +    unsigned properties;
> +#define FF_CODEC_PROPERTY_LOSSLESS        0x00000001
> +#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002

FF_ symbols are internal. Why do you add new FF_ symbols that are
apparently supposed to be used by the user?

>  } AVCodecContext;
>  
>  AVRational av_codec_get_pkt_timebase         (const AVCodecContext *avctx);
> @@ -3181,6 +3191,8 @@ void       av_codec_set_pkt_timebase         (AVCodecContext *avctx, AVRational
>  const AVCodecDescriptor *av_codec_get_codec_descriptor(const AVCodecContext *avctx);
>  void                     av_codec_set_codec_descriptor(AVCodecContext *avctx, const AVCodecDescriptor *desc);
>  
> +unsigned av_codec_get_codec_properties(const AVCodecContext *avctx);
> +
>  int  av_codec_get_lowres(const AVCodecContext *avctx);
>  void av_codec_set_lowres(AVCodecContext *avctx, int val);
>  
> diff --git a/libavcodec/h264.c b/libavcodec/h264.c
> index f62ad6a..eb834f1 100644
> --- a/libavcodec/h264.c
> +++ b/libavcodec/h264.c
> @@ -886,6 +886,7 @@ static void decode_postinit(H264Context *h, int setup_finished)
>              memcpy(sd->data, h->a53_caption, h->a53_caption_size);
>          av_freep(&h->a53_caption);
>          h->a53_caption_size = 0;
> +        h->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
>      }
>  
>      cur->mmco_reset = h->mmco_reset;
> diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
> index f85eabf..f046f8a 100644
> --- a/libavcodec/mjpegdec.c
> +++ b/libavcodec/mjpegdec.c
> @@ -2058,6 +2058,7 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
>                  goto fail;
>              break;
>          case SOF3:
> +            s->avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
>              s->lossless    = 1;
>              s->ls          = 0;
>              s->progressive = 0;
> @@ -2065,6 +2066,7 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
>                  goto fail;
>              break;
>          case SOF48:
> +            s->avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
>              s->lossless    = 1;
>              s->ls          = 1;
>              s->progressive = 0;
> diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
> index b0e5ae9..9947e5b 100644
> --- a/libavcodec/mpeg12dec.c
> +++ b/libavcodec/mpeg12dec.c
> @@ -1685,6 +1685,7 @@ static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size)
>              if (sd)
>                  memcpy(sd->data, s1->a53_caption, s1->a53_caption_size);
>              av_freep(&s1->a53_caption);
> +            avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
>          }
>  
>          if (s1->has_stereo3d) {
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index 0701786..fe5ac01 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -1293,6 +1293,11 @@ MAKE_ACCESSORS(AVCodecContext, codec, int, lowres)
>  MAKE_ACCESSORS(AVCodecContext, codec, int, seek_preroll)
>  MAKE_ACCESSORS(AVCodecContext, codec, uint16_t*, chroma_intra_matrix)
>  
> +unsigned av_codec_get_codec_properties(const AVCodecContext *codec)
> +{
> +    return codec->properties;
> +}
> +
>  int av_codec_get_max_lowres(const AVCodec *codec)
>  {
>      return codec->max_lowres;
> @@ -3147,6 +3152,13 @@ void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
>          if (encode) {
>              snprintf(buf + strlen(buf), buf_size - strlen(buf),
>                       ", q=%d-%d", enc->qmin, enc->qmax);
> +        } else {
> +            if (enc->properties & FF_CODEC_PROPERTY_CLOSED_CAPTIONS)
> +                snprintf(buf + strlen(buf), buf_size - strlen(buf),
> +                         ", Closed Captions");
> +            if (enc->properties & FF_CODEC_PROPERTY_LOSSLESS)
> +                snprintf(buf + strlen(buf), buf_size - strlen(buf),
> +                         ", lossless");
>          }
>          break;
>      case AVMEDIA_TYPE_AUDIO:
> diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c
> index 6888326..5b5ad99 100644
> --- a/libavcodec/vp9.c
> +++ b/libavcodec/vp9.c
> @@ -733,6 +733,8 @@ static int decode_frame_header(AVCodecContext *ctx,
>      s->uvac_qdelta = get_bits1(&s->gb) ? get_sbits_inv(&s->gb, 4) : 0;
>      s->lossless    = s->yac_qi == 0 && s->ydc_qdelta == 0 &&
>                       s->uvdc_qdelta == 0 && s->uvac_qdelta == 0;
> +    if (s->lossless)
> +        ctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
>  
>      /* segmentation header info */
>      s->segmentation.ignore_refmap = 0;
> diff --git a/libavcodec/webp.c b/libavcodec/webp.c
> index 723a847..8caa6a2 100644
> --- a/libavcodec/webp.c
> +++ b/libavcodec/webp.c
> @@ -1417,6 +1417,7 @@ static int webp_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
>                                                  chunk_size, 0);
>                  if (ret < 0)
>                      return ret;
> +                avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
>              }
>              bytestream2_skip(&gb, chunk_size);
>              break;

The lossless mode can apparently change mid-stream, so it should NOT be
an AVCodecContext field. Use per-frame side-data instead.


More information about the ffmpeg-devel mailing list