[FFmpeg-devel] [PATCH] qsvenc: write a53 caption data to SEI

Will Kelleher WKelleher at gogoair.com
Mon Nov 9 15:37:24 CET 2015


On 11/7/15, 12:32 PM, "ffmpeg-devel on behalf of Ivan Uskov" <ffmpeg-devel-bounces at ffmpeg.org on behalf of ivan.uskov at nablet.com> wrote:



>Hello Will,
>
>Saturday, November 7, 2015, 5:29:15 PM, you wrote:
>
>WK> ---
>WK>  libavcodec/qsvenc.c      | 114
>WK> +++++++++++++++++++++++++++++++++++++++++++++--
>WK>  libavcodec/qsvenc.h      |   2 +-
>WK>  libavcodec/qsvenc_h264.c |   2 +-
>WK>  3 files changed, 113 insertions(+), 5 deletions(-)
>
>WK> diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
>WK> index df1f777..0ee45f9 100644
>WK> --- a/libavcodec/qsvenc.c
>WK> +++ b/libavcodec/qsvenc.c
>WK> @@ -30,6 +30,7 @@
>WK>  #include "libavutil/log.h"
>WK>  #include "libavutil/time.h"
>WK>  #include "libavutil/imgutils.h"
>WK> +#include "libavcodec/bytestream.h"
>WK>  
>WK>  #include "avcodec.h"
>WK>  #include "internal.h"
>WK> @@ -276,7 +277,7 @@ int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q)
>WK>      q->param.AsyncDepth = q->async_depth;
>WK>  
>WK>      q->async_fifo = av_fifo_alloc((1 + q->async_depth) *
>WK> -                                  (sizeof(AVPacket) +
>WK> sizeof(mfxSyncPoint) + sizeof(mfxBitstream*)));
>WK> +                                  (sizeof(AVPacket) +
>WK> sizeof(mfxSyncPoint) + sizeof(mfxBitstream*) + sizeof(mfxEncodeCtrl*)));
>WK>      if (!q->async_fifo)
>WK>          return AVERROR(ENOMEM);
>WK>  
>WK> @@ -494,6 +495,27 @@ static void print_interlace_msg(AVCodecContext *avctx, QSVEncContext *q)
>WK>      }
>WK>  }
>WK>  
>WK> +static void freep_encoder_ctrl(mfxEncodeCtrl** enc_ptr)
>WK> +{
>WK> +    mfxEncodeCtrl* enc_ctrl;
>WK> +
>WK> +    if (!enc_ptr)
>WK> +        return;
>WK> +
>WK> +    enc_ctrl = *enc_ptr;
>WK> +
>WK> +    if (enc_ctrl) {
>WK> +        int i;
>WK> +        for (i = 0; i < enc_ctrl->NumPayload; i++) {
>WK> +            av_free(enc_ctrl->Payload[i]->Data);
>WK> +            av_freep(&enc_ctrl->Payload[i]);
>WK> +        }
>WK> +        av_free(enc_ctrl->Payload);
>WK> +        av_freep(&enc_ctrl);
>WK> +    }
>WK> +    *enc_ptr = NULL;
>WK> +}
>WK> +
>WK>  int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q,
>WK>                    AVPacket *pkt, const AVFrame *frame, int *got_packet)
>WK>  {
>WK> @@ -504,6 +526,10 @@ int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q,
>WK>      mfxSyncPoint sync      = NULL;
>WK>      int ret;
>WK>  
>WK> +    // for A53 CC data
>WK> +    mfxEncodeCtrl* enc_ctrl = NULL;
>WK> +    AVFrameSideData *side_data = NULL;
>WK> +
>WK>      if (frame) {
>WK>          ret = submit_frame(q, frame, &surf);
>WK>          if (ret < 0) {
>WK> @@ -526,8 +552,83 @@ int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q,
>WK>      bs->Data      = new_pkt.data;
>WK>      bs->MaxLength = new_pkt.size;
>WK>  
>+    if (q->>a53_cc && frame) {
>WK> +        side_data = av_frame_get_side_data(frame, AV_FRAME_DATA_A53_CC);
>WK> +        if (side_data) {
>Although   the  code  looks  ok  by itself, I believe it is bad idea to place
>H.264-specific   code    to   the   function   which  is  common    for   all
>encoders.  I believe H.264-specific user data insertion should  locates  into
>the qsvenc_h264.c 
>I.e. there is necessary some kind of 'SetEncodeCtrl' callback which points to
>function into the encoder-specific module.
>I believe if you will define a callback pointer QSVEncContext::SetEncodeCtrlCB,
>setup  it  into  qsv_enc_init()  of the qsvenc_h264.c and call if it non-zero
>from   ff_qsv_encode()  we  will  have  good base to extend add user data for
>MPEG2 later. Else we will get very bulky and ugly ff_qsv_encode().
>I can release something but I hope you will able to catch my idea.
>Please let me know if something is unclear.

Makes sense.  I will send an updated patch today or tomorrow.  Thanks!

>
>-- 
>Best regards,
> Ivan                            mailto:ivan.uskov at nablet.com
>
>_______________________________________________
>ffmpeg-devel mailing list
>ffmpeg-devel at ffmpeg.org
>http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


More information about the ffmpeg-devel mailing list