[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