How can I set It ? In the examples included I didn't find this. best regards
At 09.09 03/04/2012 +0200, you wrote: >2012/4/3 <[email protected]> > >> Hi to all >> I am attempting to transcode compressed SD video in JP2K format to MPEG-2 >> compressed video at 30, 40 and 50Mbit >> using libavcodec only for compressing. Here is the code: >> >> pQTcodec = avcodec_find_encoder(CODEC_ID_MPEG2VIDEO); // find the mpeg2 >> video encoder >> if (!pQTcodec) {str1="Unable to find codec MPEG2";ferr=-1; goto >> _CoreMakeMPEG2Video_err;} >> >> pQTCodecCtx = avcodec_alloc_context3(pQTcodec); >> if(pQTCodecCtx==NULL) {str1="Unable to alloc codec context";ferr=-2; goto >> _CoreMakeMPEG2Video_err;} >> pQTFrame = avcodec_alloc_frame(); >> if(pQTFrame==NULL) {str1="Unable to alloc frame";ferr=-3; goto >> _CoreMakeMPEG2Video_err;} >> >> switch(comp_drate) >> { >> case 0 :cvbr=30000000; break; // 30Mbs >> case 1 :cvbr=40000000; break; // 40Mbs >> case 2 :cvbr=50000000; break; // 50Mbs >> default :cvbr=25000000; break; // 25Mbs >> } >> >> pQTCodecCtx->bit_rate = cvbr; >> >> pQTCodecCtx->rc_max_rate = pQTCodecCtx->rc_min_rate =pQTCodecCtx->bit_rate >> = cvbr; >> >> pQTCodecCtx->flags = CODEC_FLAG_INTERLACED_DCT | >> CODEC_CAP_AUTO_THREADS;// >> | CODEC_FLAG_SVCD_SCAN_OFFSET ; >> >> pQTCodecCtx->flags2 = CODEC_FLAG2_INTRA_VLC | >> CODEC_FLAG2_NON_LINEAR_QUANT; >> >> pQTCodecCtx->qmin = 1; >> pQTCodecCtx->vbv_delay = 3600; >> pQTCodecCtx->rtp_payload_size = 1; >> pQTCodecCtx->rc_buffer_size = 2000000; >> pQTCodecCtx->rc_initial_buffer_occupancy = 2000000; >> >> pQTCodecCtx->lmin = 1*FF_QP2LAMBDA; >> pQTCodecCtx->rc_max_available_vbv_use = 1; >> pQTCodecCtx->rc_min_vbv_overflow_use = 1; >> vform.num = 4; >> vform.den = 3; >> pQTCodecCtx->sample_aspect_ratio = vform; >> pQTCodecCtx->rc_buffer_aggressivity = 0.25F; >> pQTCodecCtx->intra_dc_precision = 2; >> pQTCodecCtx->qmax = 3; >> >> after this I call a routine that expands original frame (jpeg 2000 >> compressed) and recompress in MPEG2 format. To this routine I pass the >> pointer to Codec Context (pQTCodecCtx) , the pointer to a frame (pQTFrame) >> and the pointer to the codec; that is >> >> >> int Expand_Inter_MPEG2Comp_Image(unsigned char * frame, void *pCodecCtx, >> void *pFrame,void *p_codec) >> { >> AVFrame *locpFrame; >> AVCodecContext *locpCodecCtx; >> AVCodec *codec; >> >> locpCodecCtx = (AVCodecContext*) pCodecCtx; >> locpFrame = (AVFrame*)pFrame; >> codec = (AVCodec*) p_codec; >> >> locpCodecCtx->width = Hsize; >> locpCodecCtx->height = (Vsize<<1) + 32; // Add 32 blank rows on top for >> compatibility >> /* frames per second */ >> >> locpCodecCtx->time_base.num = 1; >> locpCodecCtx->time_base.den = 25; >> locpCodecCtx->gop_size = 0; /* emit only intra frame */ >> locpCodecCtx->max_b_frames=0; >> locpCodecCtx->pix_fmt = PIX_FMT_YUV422P; ///< planar YUV 4:2:2, 16bpp, (1 >> Cr & Cb sample per 2x1 Y samples) >> >> rtv = av_image_alloc(locpFrame->data, locpFrame->linesize, >> locpCodecCtx->width, locpCodecCtx->height, >> locpCodecCtx->pix_fmt, 1); >> >> >> <code for expanding original JP2K frame and setting raw data in >> locpFrame->data array> >> >> locpFrame->qscale_type = 1; >> locpFrame->top_field_first = 1; >> locpFrame->interlaced_frame = 1; >> >> if (avcodec_open2(locpCodecCtx, codec,NULL) < 0) {rtv=-6;str1="on av codec >> open";goto __end_rdec;} >> >> encBufSize = 0x500000; >> out_size = avcodec_encode_video(locpCodecCtx, >> &tempBuffer[kagsz],encBufSize >> , locpFrame); >> >> >> return out_size; >> } >> >> in this case if I set different frame rates, the result is a file of >> different size for each frame. >> The size is congruent with frame rate, the headers are set accordingly, but >> the remainig content is the same! ! >> As if the only thing is to adjust headers. The only difference is that >> files with highter frame rate are filled with zeroes at the end. >> I upload the compressed images of the first frame compressed at 50M and at >> 40M. Here you can see that the only diference is the header and the zero >> fill at the end in order to obtain the size. The same frame recompressed >> with final cut pro gives compressed stream very different. >> >> _______________________________________________ >> Libav-user mailing list >> [email protected] >> http://ffmpeg.org/mailman/listinfo/libav-user >> > >did you set the right PTS Timestamps for the Frames to be encoded? >The PTS Timestamps are needed by the Encoder to calculate the right bitrate. > > >-- >*Media Encoding Cluster <http://codergrid.de>, * >*the first Open Source Cluster Encoding Solution * >*for distributed Media Encoding.* > > > >__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 7014 (20120330) __________ > >Il messaggio è stato controllato da ESET NOD32 Antivirus. > >www.nod32.it > ><br><br><div class="gmail_quote">2012/4/3 <span dir="ltr"><<a href="mailto:[email protected]">[email protected]</a>></span> <br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> >Hi to all<br> >I am attempting to transcode compressed SD video in JP2K format to MPEG-2<br> >compressed video at 30, 40 and 50Mbit<br> >using libavcodec only for compressing. Here is the code:<br> ><br> > pQTcodec = avcodec_find_encoder(CODEC_ID_MPEG2VIDEO); // find the mpeg2<br> >video encoder<br> > if (!pQTcodec) {str1="Unable to find codec MPEG2";ferr=-1; goto<br> >_CoreMakeMPEG2Video_err;}<br> ><br> > pQTCodecCtx = avcodec_alloc_context3(pQTcodec);<br> > if(pQTCodecCtx==NULL) {str1="Unable to alloc codec context";ferr=-2; goto<br> >_CoreMakeMPEG2Video_err;}<br> > pQTFrame = avcodec_alloc_frame();<br> > if(pQTFrame==NULL) {str1="Unable to alloc frame";ferr=-3; goto<br> >_CoreMakeMPEG2Video_err;}<br> ><br> > switch(comp_drate)<br> > {<br> > case 0 :cvbr=30000000; break; // 30Mbs<br> > case 1 :cvbr=40000000; break; // 40Mbs<br> > case 2 :cvbr=50000000; break; // 50Mbs<br> > default :cvbr=25000000; break; // 25Mbs<br> > }<br> ><br> > pQTCodecCtx->bit_rate = cvbr;<br> ><br> > pQTCodecCtx->rc_max_rate = pQTCodecCtx->rc_min_rate =pQTCodecCtx->bit_rate<br> >= cvbr;<br> ><br> > pQTCodecCtx->flags = CODEC_FLAG_INTERLACED_DCT | CODEC_CAP_AUTO_THREADS;//<br> >| CODEC_FLAG_SVCD_SCAN_OFFSET ;<br> ><br> > pQTCodecCtx->flags2 = CODEC_FLAG2_INTRA_VLC | CODEC_FLAG2_NON_LINEAR_QUANT;<br> ><br> > pQTCodecCtx->qmin = 1;<br> > pQTCodecCtx->vbv_delay = 3600;<br> > pQTCodecCtx->rtp_payload_size = 1;<br> > pQTCodecCtx->rc_buffer_size = 2000000;<br> > pQTCodecCtx->rc_initial_buffer_occupancy = 2000000;<br> ><br> > pQTCodecCtx->lmin = 1*FF_QP2LAMBDA;<br> > pQTCodecCtx->rc_max_available_vbv_use = 1;<br> > pQTCodecCtx->rc_min_vbv_overflow_use = 1;<br> > vform.num = 4;<br> > vform.den = 3;<br> > pQTCodecCtx->sample_aspect_ratio = vform;<br> > pQTCodecCtx->rc_buffer_aggressivity = 0.25F;<br> > pQTCodecCtx->intra_dc_precision = 2;<br> > pQTCodecCtx->qmax = 3;<br> ><br> >after this I call a routine that expands original frame (jpeg 2000<br> >compressed) and recompress in MPEG2 format. To this routine I pass the<br> >pointer to Codec Context (pQTCodecCtx) , the pointer to a frame (pQTFrame)<br> >and the pointer to the codec; that is<br> ><br> ><br> >int Expand_Inter_MPEG2Comp_Image(unsigned char * frame, void *pCodecCtx,<br> >void *pFrame,void *p_codec)<br> >{<br> > AVFrame *locpFrame;<br> > AVCodecContext *locpCodecCtx;<br> > AVCodec *codec;<br> ><br> > locpCodecCtx = (AVCodecContext*) pCodecCtx;<br> > locpFrame = (AVFrame*)pFrame;<br> > codec = (AVCodec*) p_codec;<br> ><br> > locpCodecCtx->width = Hsize;<br> > locpCodecCtx->height = (Vsize<<1) + 32; // Add 32 blank rows on top for<br> >compatibility<br> > /* frames per second */<br> ><br> > locpCodecCtx->time_base.num = 1;<br> > locpCodecCtx->time_base.den = 25;<br> > locpCodecCtx->gop_size = 0; /* emit only intra frame */<br> > locpCodecCtx->max_b_frames=0;<br> > locpCodecCtx->pix_fmt = PIX_FMT_YUV422P; ///< planar YUV 4:2:2, 16bpp, (1<br> >Cr & Cb sample per 2x1 Y samples)<br> ><br> > rtv = av_image_alloc(locpFrame->data, locpFrame->linesize,<br> > locpCodecCtx->width, locpCodecCtx->height,<br> >locpCodecCtx->pix_fmt, 1);<br> ><br> ><br> ><code for expanding original JP2K frame and setting raw data in<br> >locpFrame->data array><br> ><br> > locpFrame->qscale_type = 1;<br> > locpFrame->top_field_first = 1;<br> > locpFrame->interlaced_frame = 1;<br> ><br> > if (avcodec_open2(locpCodecCtx, codec,NULL) < 0) {rtv=-6;str1="on av codec<br> >open";goto __end_rdec;}<br> ><br> > encBufSize = 0x500000;<br> > out_size = avcodec_encode_video(locpCodecCtx, &tempBuffer[kagsz],encBufSize<br> >, locpFrame);<br> ><br> ><br> > return out_size;<br> >}<br> ><br> >in this case if I set different frame rates, the result is a file of<br> >different size for each frame.<br> >The size is congruent with frame rate, the headers are set accordingly, but<br> >the remainig content is the same! !<br> >As if the only thing is to adjust headers. The only difference is that<br> >files with highter frame rate are filled with zeroes at the end.<br> >I upload the compressed images of the first frame compressed at 50M and at<br> >40M. Here you can see that the only diference is the header and the zero<br> >fill at the end in order to obtain the size. The same frame recompressed<br> >with final cut pro gives compressed stream very different.<br> ><br> >_______________________________________________<br> >Libav-user mailing list<br> ><a href="mailto:[email protected]">[email protected]</a><br> ><a href="http://ffmpeg.org/mailman/listinfo/libav-user" target="_blank">http://ffmpeg.org/mailman/listinfo/libav-user</a><br> ></blockquote></div><br>did you set the right PTS Timestamps for the Frames to be encoded?<div>The PTS Timestamps are needed by the Encoder to calculate the right bitrate.</div><div><br clear="all"><div><br></div>-- <br><span style="color:rgb(51,51,51);font-family:'Lucida Grande',Helvetica,Verdana,sans-serif;font-size:12px;line-height:20px"><b ><u><a href="http://codergrid.de" target="_blank">Media Encoding Cluster</a></u>, </b></span><div> ><span style="color:rgb(51,51,51);font-family:'Lucida Grande',Helvetica,Verdana,sans-serif;font-size:12px;line-height:20px"><b >the first Open Source Cluster Encoding Solution </b></span></div><div><span style="color:rgb(51,51,51);font-family:'Lucida Grande',Helvetica,Verdana,sans-serif;font-size:12px;line-height:20px"><b >for distributed Media Encoding.</b></span></div> ><br> ></div> >_______________________________________________ >Libav-user mailing list >[email protected] >http://ffmpeg.org/mailman/listinfo/libav-user > > > >__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 7014 (20120330) __________ > >Il messaggio è stato controllato da ESET NOD32 Antivirus. > >www.nod32.it > > _______________________________________________ Libav-user mailing list [email protected] http://ffmpeg.org/mailman/listinfo/libav-user
