Hello,

I find the solution. I give every frame a correct pts-value like this:

pts += (40 * frameNr) * 90;
...
frame->pts = pts

and then

avcodec_encode_video (...).

And now it works.

regards,
Sven

Am Tuesday 12 May 2009 16:47:40 schrieben Sie:
> 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

Reply via email to