[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