[Libav-user] Provided packet is too small, needs to be x

Karthik Viswanathan vkarthik at entrayn.com
Sat Jun 8 16:37:17 CEST 2013


Any help would be appreciated.

Thanks
Karthik

On 6 June 2013 15:51, Karthik Viswanathan <vkarthik90 at gmail.com> wrote:
> Hello,
>
> I got the ffmpeg builds from zeranoe[20130601-git-716dbc7] & used gcc
> 4.8.0 on windows to compile.
>
> I am trying to convert a h264 video to webm. The output video is empty
> and the console is filled with 'Provided packet is too small, needs to
> be 612'.
>
> ////////////////////// the decoder:
>
>   pFormatCtxIn = avformat_alloc_context();
>
>   ret = avformat_open_input(&pFormatCtxIn, "bump.mp4", NULL, NULL);
>
>   if(avformat_find_stream_info(pFormatCtxIn,NULL)<0)
>     return -1;
>
>   video_stream_idx = -1;
>   for(i=0; i<pFormatCtxIn->nb_streams; i++){
>     if(pFormatCtxIn->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO)
>     {
>       video_stream_idx=i;
>     }
>   }
>
>   if(video_stream_idx==-1)
>     return -1;
>
>   pCodecCtxIn = pFormatCtxIn->streams[video_stream_idx]->codec;
>
>   pCodecIn = avcodec_find_decoder(pCodecCtxIn->codec_id);
>
>   avcodec_open2(pCodecCtxIn,pCodecIn, NULL);
>
>   if(pCodecCtxIn->time_base.num>1000 && pCodecCtxIn->time_base.den==1)
>     pCodecCtxIn->time_base.den=1000;
>
> /////////////////// the encoder:
>
>   pOfmtOut = av_guess_format(NULL, filename,NULL);
>
>   pFormatCtxOut = avformat_alloc_context();
>
>   pOfmtOut->video_codec = AV_CODEC_ID_VP8;
>
>   pFormatCtxOut->oformat = pOfmtOut;
>
>   snprintf(pFormatCtxOut->filename,sizeof(pFormatCtxOut->filename),"%s",filename);
>
>   strmVdoOut = avformat_new_stream(pFormatCtxOut,NULL);
>
>   pCodecCtxOut = strmVdoOut->codec;
>
>   pCodecCtxOut->codec_id = pOfmtOut->video_codec;
>   pCodecCtxOut->codec_type = AVMEDIA_TYPE_VIDEO;
>
>   pCodecCtxOut->bit_rate = 4000; /* open it */
>   pCodecCtxOut->pix_fmt = AV_PIX_FMT_YUV420P;
>   pCodecCtxOut->width = 1360;
>   pCodecCtxOut->height = 760;
>   pCodecCtxOut->time_base= (AVRational){1,30};
>
>   if(pFormatCtxOut->oformat->flags & AVFMT_GLOBALHEADER)
>     pCodecCtxOut->flags |= CODEC_FLAG_GLOBAL_HEADER;
>
>   pCodecOut = avcodec_find_encoder(pCodecCtxOut->codec_id);
>
>   avcodec_open2(pCodecCtxOut, pCodecOut,NULL);
>
>   avio_open(&pFormatCtxOut->pb, filename, AVIO_FLAG_WRITE);
>
>   ret = avformat_write_header(pFormatCtxOut, NULL);
>
> /////////////////// frame allocation
>
>   frame = avcodec_alloc_frame();
>
>   frame->format = pCodecCtxOut->pix_fmt;
>   frame->width  = pCodecCtxOut->width;
>   frame->height = pCodecCtxOut->height;
>
>   ret = av_image_alloc(frame->data, frame->linesize,
> pCodecCtxOut->width, pCodecCtxOut->height,pCodecCtxOut->pix_fmt, 32);
>
> //////////////////// the transcoding
>
>  i = 0;
>   while(++i) {
>     av_init_packet(&packet);
>
>     ret = av_read_frame(pFormatCtxIn,&packet);
>     if(ret < 0){
>       fprintf(stderr,"Error reading frame\n");
>       break;
>     }
>
>     if(packet.stream_index == video_stream_idx){
>
>       ret = avcodec_decode_video2(pCodecCtxIn,frame,&got_output,&packet);
>
>       if (got_output) {
>
>         frame->pts=i;
>
>         ret = avcodec_encode_video2(pCodecCtxOut, &packet, frame, &got_output);
>
>         if (got_output) {
>
>           if (pCodecCtxOut->coded_frame->pts != (0x8000000000000000LL))
>             packet.pts = av_rescale_q(pCodecCtxOut->coded_frame->pts,
> pCodecCtxOut->time_base, strmVdoOut->time_base);
>
>           if(pCodecCtxOut->coded_frame->key_frame)
>             packet.flags |= AV_PKT_FLAG_KEY;
>
>           if(av_interleaved_write_frame(pFormatCtxOut,&packet) < 0){
>             fprintf(stderr,"error writing frame");
>             exit(1);
>           }
>         }
>       }
>     }
>     av_free_packet(&packet);
>   }
>
> The full code is available here: https://www.dropbox.com/s/agltcde1o1mej7h/try.c



-- 
- Karthik


More information about the Libav-user mailing list