[005/264] libopenh264enc: export CPB props side data

Message ID 1447012658-16819-6-git-send-email-anton@khirnov.net
State Committed
Headers show

Commit Message

Anton Khirnov Nov. 8, 2015, 7:57 p.m.
---
 libavcodec/internal.h       |  5 +++++
 libavcodec/libopenh264enc.c |  9 +++++++++
 libavcodec/utils.c          | 26 ++++++++++++++++++++++++++
 3 files changed, 40 insertions(+)

Comments

Hendrik Leppkes Nov. 8, 2015, 11:49 p.m. | #1
On Sun, Nov 8, 2015 at 8:57 PM, Anton Khirnov <anton@khirnov.net> wrote:
> ---
>  libavcodec/internal.h       |  5 +++++
>  libavcodec/libopenh264enc.c |  9 +++++++++
>  libavcodec/utils.c          | 26 ++++++++++++++++++++++++++
>  3 files changed, 40 insertions(+)
>
> diff --git a/libavcodec/internal.h b/libavcodec/internal.h
> index 500511d..24d28e2 100644
> --- a/libavcodec/internal.h
> +++ b/libavcodec/internal.h
> @@ -240,4 +240,9 @@ int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt);
>   */
>  int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame);
>
> +/**
> + * Add a CPB properties side data to an encoding context.
> + */
> +AVCPBProperties *ff_add_cpb_sd(AVCodecContext *avctx);
> +

That function name seems rather obscure. Maybe something a little more
verbose wouldn't hurt?

>  #endif /* AVCODEC_INTERNAL_H */
> diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c
> index 0671c6f..f5e5f93 100644
> --- a/libavcodec/libopenh264enc.c
> +++ b/libavcodec/libopenh264enc.c
> @@ -108,6 +108,7 @@ static av_cold int svc_encode_init(AVCodecContext *avctx)
>      int err = AVERROR_UNKNOWN;
>      int log_level;
>      WelsTraceCallback callback_function;
> +    AVCPBProperties *props;
>
>      // Mingw GCC < 4.7 on x86_32 uses an incorrect/buggy ABI for the WelsGetCodecVersion
>      // function (for functions returning larger structs), thus skip the check in those
> @@ -223,6 +224,14 @@ static av_cold int svc_encode_init(AVCodecContext *avctx)
>          memcpy(avctx->extradata, fbi.sLayerInfo[0].pBsBuf, size);
>      }
>
> +    props = ff_add_cpb_sd(avctx);
> +    if (!props) {
> +        err = AVERROR(ENOMEM);
> +        goto fail;
> +    }
> +    props->max_bitrate = param.iMaxBitrate;
> +    props->avg_bitrate = param.iTargetBitrate;
> +
>      return 0;
>
>  fail:
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index d2f4de7..685d260 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -2383,3 +2383,29 @@ AVCPBProperties *av_cpb_properties_alloc(size_t *size)
>
>      return props;
>  }
> +
> +AVCPBProperties *ff_add_cpb_sd(AVCodecContext *avctx)
> +{
> +    AVPacketSideData *tmp;
> +    AVCPBProperties  *props;
> +    size_t size;
> +
> +    props = av_cpb_properties_alloc(&size);
> +    if (!props)
> +        return NULL;
> +
> +    tmp = av_realloc_array(avctx->coded_side_data, avctx->nb_coded_side_data + 1, sizeof(*tmp));
> +    if (!tmp) {
> +        av_freep(&props);
> +        return NULL;
> +    }
> +
> +    avctx->coded_side_data = tmp;
> +    avctx->nb_coded_side_data++;
> +
> +    avctx->coded_side_data[avctx->nb_coded_side_data - 1].type = AV_PKT_DATA_CPB_PROPERTIES;
> +    avctx->coded_side_data[avctx->nb_coded_side_data - 1].data = (uint8_t*)props;
> +    avctx->coded_side_data[avctx->nb_coded_side_data - 1].size = size;
> +
> +    return props;
> +}
> --
> 2.0.0
>
> _______________________________________________
> libav-devel mailing list
> libav-devel@libav.org
> https://lists.libav.org/mailman/listinfo/libav-devel

Patch

diff --git a/libavcodec/internal.h b/libavcodec/internal.h
index 500511d..24d28e2 100644
--- a/libavcodec/internal.h
+++ b/libavcodec/internal.h
@@ -240,4 +240,9 @@  int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt);
  */
 int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame);
 
+/**
+ * Add a CPB properties side data to an encoding context.
+ */
+AVCPBProperties *ff_add_cpb_sd(AVCodecContext *avctx);
+
 #endif /* AVCODEC_INTERNAL_H */
diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c
index 0671c6f..f5e5f93 100644
--- a/libavcodec/libopenh264enc.c
+++ b/libavcodec/libopenh264enc.c
@@ -108,6 +108,7 @@  static av_cold int svc_encode_init(AVCodecContext *avctx)
     int err = AVERROR_UNKNOWN;
     int log_level;
     WelsTraceCallback callback_function;
+    AVCPBProperties *props;
 
     // Mingw GCC < 4.7 on x86_32 uses an incorrect/buggy ABI for the WelsGetCodecVersion
     // function (for functions returning larger structs), thus skip the check in those
@@ -223,6 +224,14 @@  static av_cold int svc_encode_init(AVCodecContext *avctx)
         memcpy(avctx->extradata, fbi.sLayerInfo[0].pBsBuf, size);
     }
 
+    props = ff_add_cpb_sd(avctx);
+    if (!props) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+    props->max_bitrate = param.iMaxBitrate;
+    props->avg_bitrate = param.iTargetBitrate;
+
     return 0;
 
 fail:
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index d2f4de7..685d260 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -2383,3 +2383,29 @@  AVCPBProperties *av_cpb_properties_alloc(size_t *size)
 
     return props;
 }
+
+AVCPBProperties *ff_add_cpb_sd(AVCodecContext *avctx)
+{
+    AVPacketSideData *tmp;
+    AVCPBProperties  *props;
+    size_t size;
+
+    props = av_cpb_properties_alloc(&size);
+    if (!props)
+        return NULL;
+
+    tmp = av_realloc_array(avctx->coded_side_data, avctx->nb_coded_side_data + 1, sizeof(*tmp));
+    if (!tmp) {
+        av_freep(&props);
+        return NULL;
+    }
+
+    avctx->coded_side_data = tmp;
+    avctx->nb_coded_side_data++;
+
+    avctx->coded_side_data[avctx->nb_coded_side_data - 1].type = AV_PKT_DATA_CPB_PROPERTIES;
+    avctx->coded_side_data[avctx->nb_coded_side_data - 1].data = (uint8_t*)props;
+    avctx->coded_side_data[avctx->nb_coded_side_data - 1].size = size;
+
+    return props;
+}