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.
Originally committed as revision 19310 to svn://svn.ffmpeg.org/ffmpeg/trunk
x264_param_t params;
x264_t *enc;
x264_picture_t pic;
x264_param_t params;
x264_t *enc;
x264_picture_t pic;
+ uint8_t *sei;
+ int sei_size;
AVFrame out_pic;
} X264Context;
AVFrame out_pic;
} X264Context;
-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;
+ 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++){
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;
if(s < 0)
return -1;
p += s;
- bufsize = encode_nals(buf, bufsize, nal, nnal);
+ bufsize = encode_nals(ctx, buf, bufsize, nal, nnal, 0);
if(bufsize < 0)
return -1;
if(bufsize < 0)
return -1;
X264Context *x4 = avctx->priv_data;
av_freep(&avctx->extradata);
X264Context *x4 = avctx->priv_data;
av_freep(&avctx->extradata);
if(x4->enc)
x264_encoder_close(x4->enc);
if(x4->enc)
x264_encoder_close(x4->enc);
{
X264Context *x4 = avctx->priv_data;
{
X264Context *x4 = avctx->priv_data;
x264_param_default(&x4->params);
x4->params.pf_log = X264_log;
x264_param_default(&x4->params);
x4->params.pf_log = X264_log;
s += 5 + nal[i].i_payload * 4 / 3;
avctx->extradata = av_malloc(s);
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);