The code that I have:



#include "libavutil/opt.h"
#include "avcodec.h"
#include "internal.h"

typedef struct A53EncodeContext {
    const AVClass *class;
} A53EncodeContext;


static int a53cc_encode(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
{
    A53EncodeContext *ctx = avctx->priv_data;

    int ret;

    for (int i = 0; i < frame->nb_side_data; i++) {
        AVFrameSideData *sd = frame->side_data[i];

        av_log(ctx, AV_LOG_INFO, "  side data - ");
        if (sd->type == AV_FRAME_DATA_A53_CC) {

            //Create AVPacket to hold extracted CC
            if ((ret = ff_alloc_packet2(avctx, avpkt, sd->size, 0)) < 0) {
                *got_packet_ptr = 0;
                return ret;
            }

            //Copy CC packet
            memcpy(avpkt->data, sd->data, sd->size);
            avpkt->stream_index = 0;
            avpkt->pts = frame->pts;
            avpkt->pos = frame->pkt_pos;

            av_log(ctx, AV_LOG_INFO, "A/53 closed captions (%d bytes)\n", sd->size);
            for (int offset = 0; offset < sd->size; offset++) {
                av_log(ctx, AV_LOG_INFO, "%0x", sd->data[offset]);
            }

            *got_packet_ptr = 1;
            return 0;
        }

        av_log(ctx, AV_LOG_INFO, "\n");
    }


    *got_packet_ptr = 0;
    return 0;
}


#define OFFSET(x) offsetof(A53EncodeContext, x)
#define SE AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM
static const AVOption a53cc_options[] = {
    { NULL },
};

static const AVClass a53ccenc_class = {
    .class_name = "A53 caption encoder",
    .item_name  = av_default_item_name,
    .option     = a53cc_options,
    .version    = LIBAVUTIL_VERSION_INT,
};

AVCodec ff_a53cc_encoder = {
    .name           = "a53cc",
    .long_name      = NULL_IF_CONFIG_SMALL("A/53 captions"),
    .type           = AVMEDIA_TYPE_VIDEO,
    .id             = AV_CODEC_ID_EIA_608,
    //.init           = a53cc_init,
    .encode2        = a53cc_encode,
    .priv_class     = &a53ccenc_class,
    .priv_data_size = sizeof(A53EncodeContext),
};


lyncher

On 07-06-2019 17:16, Devin Heitmueller wrote:
Hi Lyncher,

On Fri, Jun 7, 2019 at 11:48 AM <[email protected]> wrote:
I'm not getting how can I define the codec ID to an AVPacket.....
Should I set something at AVCodecContext?
So those fields are not describing the AVPacket.  They're describing
the codec.  That said, the codec itself has three different references
to the AVMediaType (the codec description, codec context, and codec
parameters).  While I know it uses at least one of those to know what
type of AVFrames can be dispatched to it (e.g. to prevent you from
sending audio AVFrames to a video encoder), I'm not sure which the .id
field ties directly to, or what happens if all three of those values
aren't the same.  At least the codec parameters needs to reflect the
subtitle type in order for subtitle decoders such as ccaption_dec to
be able to accept packets from it.

Interesting.  I would have to do some experimentation to see what the
right path is here.

Devin


_______________________________________________
Libav-user mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/libav-user

To unsubscribe, visit link above, or email
[email protected] with subject "unsubscribe".

Reply via email to