[Libav-user] Bit rate not changing

francesco at bltitalia.com francesco at bltitalia.com
Tue Apr 3 09:33:51 CEST 2012


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 <francesco at bltitalia.com>
>
>> 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
>> Libav-user at ffmpeg.org
>> 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:francesco at bltitalia.com">francesco at bltitalia.com</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:Libav-user at ffmpeg.org">Libav-user at ffmpeg.org</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
>Libav-user at ffmpeg.org
>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
>
>



More information about the Libav-user mailing list