[Libav-user] Encoding in MPEG2 XDCAM 50Mbit problem
francesco at bltitalia.com
francesco at bltitalia.com
Mon Jun 25 10:19:37 CEST 2012
Hi to all
I am attempting to encode in MPEG2 XDCAM long gop 50Mbit using libavcodec,
but I think that some settings are wrong and I can't setup values correctly.
Here is the code that generates first 20 blocks of data in separate files:
/* find the video encoder */
pcodec_xd = avcodec_find_encoder(CODEC_ID_MPEG2VIDEO);
if (pcodec_xd==NULL) { Memo1->Lines->Add("Unable to find codec "); goto
_Encod1Frame_err;}
pCodecCtx_xd = avcodec_alloc_context3(pcodec_xd);
if(pCodecCtx_xd==NULL) { Memo1->Lines->Add("Unable to alloc codec
context");goto _Encod1Frame_err;}
pFrame_xd = avcodec_alloc_frame();
if(pFrame_xd==NULL) { Memo1->Lines->Add("Unable to alloc frame");goto
_Encod1Frame_err;}
vform.num = 16; vform.den = 9;
pCodecCtx_xd->sample_aspect_ratio = vform; // Set 16:9 aspect ratio
pCodecCtx_xd->rc_max_rate = pCodecCtx_xd->rc_min_rate
=pCodecCtx_xd->bit_rate = 50000000;
pCodecCtx_xd->flags = CODEC_FLAG_INTERLACED_DCT |
CODEC_FLAG_INTERLACED_ME ;//| CODEC_FLAG_CLOSED_GOP ;
pCodecCtx_xd->qmin = 1; // pCodecCtx_xd->qmax = 3;
pCodecCtx_xd->rc_buffer_size = 2000000;
pCodecCtx_xd->rc_initial_buffer_occupancy = 2000000;
pCodecCtx_xd->time_base.num = 1;
pCodecCtx_xd->time_base.den = 25;
pCodecCtx_xd->gop_size = 12; pCodecCtx_xd->max_b_frames= 1;
pCodecCtx_xd->pix_fmt = PIX_FMT_YUV422P;
pCodecCtx_xd->thread_count = Thread_Count; // Thread_Count = Number of
available processors
/* resolution must be a multiple of two */
pCodecCtx_xd->width = Hsize; // Hsize = 1920
pCodecCtx_xd->height = (Vsize<<1) ; // Vsize = 540
/* the image can be allocated by any means and av_image_alloc() is
* just the most convenient way if av_malloc() is to be used */
rtv = av_image_alloc(pFrame_xd->data, pFrame_xd->linesize,
pCodecCtx_xd->width, pCodecCtx_xd->height,
pCodecCtx_xd->pix_fmt, 1);
pFrame_xd->qscale_type = 1;
pFrame_xd->top_field_first = 1;
pFrame_xd->interlaced_frame = 1;
if (avcodec_open2(pCodecCtx_xd, pcodec_xd,NULL) < 0) {rtv = -6; goto
_Encod1Frame_err; }
for(fldXDCamCnt=0;fldXDCamCnt<nuFlds;fldXDCamCnt+=2)
{
< Code for read two fields, decompress and interlace them inserting data
in pFrame_xd->data[] >
out_size = avcodec_encode_video(pCodecCtx_xd, tempBuffer,encBufSize ,
pFrame_xd); // encBufSize = 0x500000;
if(out_size>0)
{
str1 = ExtractFilePath(Application->ExeName) + "\\RecompDir\\compressed_";
str1.cat_printf("f%d_b%d.m2v",xd_frmNum,blk_cnt);
PutBufferIntoFile (str1.c_str(), tempBuffer, frameSz);
str1.printf("Saved block %d",blk_cnt); Memo1->Lines->Add(str1);
blk_cnt++;
if(blk_cnt>20) break;
}
}
Some questions:
Data out is analyzed using MPEG2-Video ES utils, and has a sample aspect
ratio of 1:2.21 not 16:9. Why ?
If I set the CODEC_FLAG_CLOSED_GOP in the pCodecCtx_xd->flags then the
avcodec_open2 routine fails
(returns -1). Why he fails ?
I have a block output for every frame in input. Shouldn't I have a block
about every 12 frames ?
Did someone have an idea ?
More information about the Libav-user
mailing list