Many thanks for your suggestion. Unfortunately, I still get -1 as the return value from avcodec_encode_video. After further investigation, I have discovered that every call to this function returns -1 except for the very first call. Any ideas?
----- Original Message ---- From: avcoder <[email protected]> To: Libav* user questions and discussions <[email protected]> Sent: Friday, 16 January, 2009 12:25:09 Subject: Re: [libav-user] Problem with avcodec_encode_video Dear: try: if (frameFinished) { // Encode the video frame (always returns -1 the second time this line is executed) int out_size =avcodec_encode_video(pOutputVideoCodecCtx, pOutputBuffer, buffer_size,pInputFrame); //--------------------------------------------------------------------------- //add the following hack, by [email protected] pInputFrame->pts++; //--------------------------------------------------------------------------- } On Fri, Jan 16, 2009 at 5:06 AM, Wayne Allen <[email protected]> wrote: > I have written a routine that converts a file from one file format to > another - the code is very strongly based on output_example.c. A > problem occurs the second time I attempt to encode a buffer that has > been read and decoded from the input file. avcodec_encode_video always > returns -1. This always happen on the second call - regardless of the > input file. Can someone please explain what I am doing wrong? > > The routine code is as follows: > > int frameFinished; > AVFormatContext* pInputFormatCtx; > AVFrame* pInputFrame; > AVPacket inputPacket; > AVCodec* pInputVideoCodec; > AVCodecContext* pInputVideoCodecCtx; > int inputVideoStreamPos = -1; > uint8_t* pOutputBuffer; > AVOutputFormat* pOutputFormat; > AVFormatContext* pOutputFormatCtx; > AVCodec* pOutputVideoCodec; > AVCodecContext* pOutputVideoCodecCtx; > AVStream* pOutputVideoStream; > > av_register_all(); > > // Open the input file > > if (av_open_input_file(&pInputFormatCtx, pInput, NULL, 0, > NULL) != 0) return FileConverterEngine::UnableToOpenInputFile; > try > { > // Get the stream information > if (av_find_stream_info(pInputFormatCtx) < 0) return > FileConverterEngine::UnableToRetrieveStreamInformation; > for (unsigned int i=0; i < pInputFormatCtx->nb_streams; i++) > { > if (pInputFormatCtx->streams[i]->codec->codec_type == > CODEC_TYPE_VIDEO) > { > inputVideoStreamPos = i; > break; > } > } > if (inputVideoStreamPos == -1) return > FileConverterEngine::MissingVideoStream; > > // Get the codec context for the stream > pInputVideoCodecCtx = > pInputFormatCtx->streams[inputVideoStreamPos]->codec; > > // Get the codec to decode the video > pInputVideoCodec = > avcodec_find_decoder(pInputVideoCodecCtx->codec_id); > if (pInputVideoCodec == NULL) return > FileConverterEngine::UnableToFindVideoDecoder; > > // Open the codec > > if (avcodec_open(pInputVideoCodecCtx, pInputVideoCodec) < > 0) return FileConverterEngine::UnableToOpenVideoDecoder; > try > { > // What format is the output file? > if ((pOutputFormat = guess_format(NULL, pOutput, NULL)) == > NULL) > { > > if ((pOutputFormat = guess_format("mpeg", NULL, > NULL)) == NULL) return FileConverterEngine::CannotGuessOutputFormat; > } > > // Allocate the output file context > > if ((pOutputFormatCtx = av_alloc_format_context()) == > NULL) return FileConverterEngine::CannotAllocateOutputFileContext; > try > { > // Associate it with the output context > pOutputFormatCtx->oformat = pOutputFormat; > > // Save the filename > _snprintf_s(pOutputFormatCtx->filename, > sizeof(pOutputFormatCtx->filename), _TRUNCATE, "%s", pOutput); > > // Add the video stream to the output file > if ((pOutputVideoStream = AddVideoStream(pOutputFormatCtx, > pOutputFormat->video_codec)) == NULL) > return > FileConverterEngine::CannotAddVideoStreamToOutputFile; > > // Set-up the output video stream > pOutputVideoCodecCtx = pOutputVideoStream->codec; > pOutputVideoCodecCtx->width = pInputVideoCodecCtx->width; > pOutputVideoCodecCtx->height = pInputVideoCodecCtx->height; > pOutputVideoCodecCtx->pix_fmt = > pInputVideoCodecCtx->pix_fmt; > > // Set the output parameters > > if (av_set_parameters(pOutputFormatCtx, NULL) < 0) > return FileConverterEngine::UnableToSetOutputParameters; > > // Get the output video codec > if (!(pOutputVideoCodec = > avcodec_find_encoder(pOutputVideoStream->codec->codec_id))) > return FileConverterEngine::UnableToFindVideoEncoder; > > // Open the output video codec > > if (avcodec_open(pOutputVideoCodecCtx, > pOutputVideoCodec) < 0) return > FileConverterEngine::UnableToOpenVideoEncoder; > try > { > // Open the output file (if needed) > if (!(pOutputFormat->flags & AVFMT_NOFILE)) > { > > if (url_fopen(&pOutputFormatCtx->pb, > pOutput, URL_WRONLY) < 0) return > FileConverterEngine::UnableToOpenOutputFile; > } > try > { > // Create the buffer to hold the encoded frame > > int buffer_size = > avpicture_get_size(pOutputVideoCodecCtx->pix_fmt, > pOutputVideoCodecCtx->width, pOutputVideoCodecCtx->height); > pOutputBuffer = (uint8_t*)av_malloc(buffer_size); > > // Write the headers to the output file > av_write_header(pOutputFormatCtx); > > // Allocate the input frame > pInputFrame = avcodec_alloc_frame(); > try > { > while (av_read_frame(pInputFormatCtx, > &inputPacket) >= 0) > { > if (inputPacket.stream_index == > inputVideoStreamPos) > { > // Decode the video frame > > if > (avcodec_decode_video(pInputVideoCodecCtx, pInputFrame, > &frameFinished, inputPacket.data, inputPacket.size) < 0) > return > FileConverterEngine::UnableToDecodeInputVideoPacket; > > if (frameFinished) > { > > // Encode the video frame (always > returns -1 the second time this line is executed) > > int out_size = > avcodec_encode_video(pOutputVideoCodecCtx, pOutputBuffer, buffer_size, > pInputFrame); > } > > // Free the packet > av_free_packet(&inputPacket); > } > } > } > finally > { > av_free(pInputFrame); > } > > // Write the trailer > av_write_trailer(pOutputFormatCtx); > } > finally > { > if (!(pOutputFormat->flags & AVFMT_NOFILE)) > { > url_fclose(pOutputFormatCtx->pb); > } > } > } > finally > { > avcodec_close(pOutputVideoCodecCtx); > } > } > finally > { > av_free(pOutputFormatCtx); > } > } > finally > { > avcodec_close(pInputVideoCodecCtx); > } > } > finally > { > av_close_input_file(pInputFormatCtx); > } > -- -------------------------------- Inspired by http://ppnext.com Your potential. Our passion. _______________________________________________ libav-user mailing list [email protected] https://lists.mplayerhq.hu/mailman/listinfo/libav-user _______________________________________________ libav-user mailing list [email protected] https://lists.mplayerhq.hu/mailman/listinfo/libav-user
