Hello Wayne, hello people, I still have the same problem like you. I also get always -1 if I use avcodec_encode_video-function. Do you have a solution now? Or does any others have an idea? It would help me very much.
regards, Sven Am Sunday 18 January 2009 23:08:12 schrieb Wayne Allen: > 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); > > } _______________________________________________ libav-user mailing list [email protected] https://lists.mplayerhq.hu/mailman/listinfo/libav-user
