Commit b307a00d authored by darkshikari's avatar darkshikari

Fix libx264.c to not drop SEI userdata from x264 encoder.

Most muxers in ffmpeg ignore the SEI if it is placed in extradata, so instead
it has to be catted to the front of the first video frame.


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19310 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 68142fe7
......@@ -30,6 +30,8 @@ typedef struct X264Context {
x264_param_t params;
x264_t *enc;
x264_picture_t pic;
uint8_t *sei;
int sei_size;
AVFrame out_pic;
} X264Context;
......@@ -51,13 +53,30 @@ X264_log(void *p, int level, const char *fmt, va_list args)
static int
encode_nals(uint8_t *buf, int size, x264_nal_t *nals, int nnal)
encode_nals(AVCodecContext *ctx, uint8_t *buf, int size, x264_nal_t *nals, int nnal, int skip_sei)
{
X264Context *x4 = ctx->priv_data;
uint8_t *p = buf;
int i;
int i, s;
/* Write the SEI as part of the first frame. */
if(x4->sei_size > 0 && nnal > 0)
{
memcpy(p, x4->sei, x4->sei_size);
p += x4->sei_size;
x4->sei_size = 0;
}
for(i = 0; i < nnal; i++){
int s = x264_nal_encode(p, &size, 1, nals + i);
/* Don't put the SEI in extradata. */
if(skip_sei && nals[i].i_type == NAL_SEI)
{
x4->sei = av_malloc( 5 + nals[i].i_payload * 4 / 3 );
if(x264_nal_encode(x4->sei, &x4->sei_size, 1, nals + i) < 0)
return -1;
continue;
}
s = x264_nal_encode(p, &size, 1, nals + i);
if(s < 0)
return -1;
p += s;
......@@ -92,7 +111,7 @@ X264_frame(AVCodecContext *ctx, uint8_t *buf, int bufsize, void *data)
&pic_out))
return -1;
bufsize = encode_nals(buf, bufsize, nal, nnal);
bufsize = encode_nals(ctx, buf, bufsize, nal, nnal, 0);
if(bufsize < 0)
return -1;
......@@ -125,6 +144,7 @@ X264_close(AVCodecContext *avctx)
X264Context *x4 = avctx->priv_data;
av_freep(&avctx->extradata);
av_free(x4->sei);
if(x4->enc)
x264_encoder_close(x4->enc);
......@@ -137,6 +157,7 @@ X264_init(AVCodecContext *avctx)
{
X264Context *x4 = avctx->priv_data;
x4->sei_size = 0;
x264_param_default(&x4->params);
x4->params.pf_log = X264_log;
......@@ -284,7 +305,7 @@ X264_init(AVCodecContext *avctx)
s += 5 + nal[i].i_payload * 4 / 3;
avctx->extradata = av_malloc(s);
avctx->extradata_size = encode_nals(avctx->extradata, s, nal, nnal);
avctx->extradata_size = encode_nals(avctx, avctx->extradata, s, nal, nnal, 1);
}
return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment