[Libav-user] need help in ffmpeg

Dmitry Adjiev adjiev.dmitry at gmail.com
Fri Nov 21 19:29:16 CET 2014


I think you should build it with all optimizations such as sse, mmx etc.
libavcodec will use these features by deafult.
Please check your build options

2014-11-17 15:56 GMT+03:00 Васькевич Руслан <jokerruslan at gmail.com>:

> this is code for decoding h264 stream from camera using ffmpeg. But I want
> to use hardware acceleration for decoding video. I Can not find good
> sample. There are a lot of question about this topic but there is no answer
>
>     string url = @"rtsp://admin:123456@192.168.0.201:554";
>
>         FFmpegInvoke.av_register_all();
>         FFmpegInvoke.avcodec_register_all();
>         FFmpegInvoke.avformat_network_init();
>
>
>         AVFormatContext* pFormatContext = FFmpegInvoke.avformat_alloc_context();
>         if (FFmpegInvoke.avformat_open_input(&pFormatContext, url, null, null) != 0)
>             throw new Exception("Could not open file");
>
>         if (FFmpegInvoke.avformat_find_stream_info(pFormatContext, null) != 0)
>             throw new Exception("Could not find stream info");
>
>         AVStream* pStream = null;
>         for (int i = 0; i < pFormatContext->nb_streams; i++)
>         {
>             if (pFormatContext->streams[i]->codec->codec_type == AVMediaType.AVMEDIA_TYPE_VIDEO)
>             {
>                 pStream = pFormatContext->streams[i];
>                 break;
>             }
>         }
>         if (pStream == null)
>             throw new Exception("Could not found video stream");
>
>         AVCodecContext codecContext = *(pStream->codec);
>         int width = codecContext.width;
>         int height = codecContext.height;
>         AVPixelFormat sourcePixFmt = codecContext.pix_fmt;
>         AVCodecID codecId = codecContext.codec_id;
>         var convertToPixFmt = AVPixelFormat.PIX_FMT_BGR24;
>         SwsContext* pConvertContext = FFmpegInvoke.sws_getContext(width, height, sourcePixFmt,
>                                                                    width, height, convertToPixFmt,
>                                                                    FFmpegInvoke.SWS_FAST_BILINEAR, null, null, null);
>         if (pConvertContext == null)
>             throw new Exception("Could not initialize the conversion context");
>
>         var pConvertedFrame = (AVPicture*)FFmpegInvoke.avcodec_alloc_frame();
>         int convertedFrameBufferSize = FFmpegInvoke.avpicture_get_size(convertToPixFmt, width, height);
>         var pConvertedFrameBuffer = (byte*)FFmpegInvoke.av_malloc((uint) convertedFrameBufferSize);
>         FFmpegInvoke.avpicture_fill(pConvertedFrame, pConvertedFrameBuffer, convertToPixFmt, width, height);
>
>         AVCodec* pCodec = FFmpegInvoke.avcodec_find_decoder(codecId);
>         if (pCodec == null)
>             throw new Exception("Unsupported codec");
>
>         // Reusing codec context from stream info,
>         // as an alternative way it could look like this: (but it works not for all kind of codecs)
>         // AVCodecContext* pCodecContext = FFmpegInvoke.avcodec_alloc_context3(pCodec);
>         AVCodecContext* pCodecContext = &codecContext;
>
>         if ((pCodec->capabilities & FFmpegInvoke.CODEC_CAP_TRUNCATED) == FFmpegInvoke.CODEC_CAP_TRUNCATED)
>             pCodecContext->flags |= FFmpegInvoke.CODEC_FLAG_TRUNCATED;
>
>         if (FFmpegInvoke.avcodec_open2(pCodecContext, pCodec, null) < 0)
>             throw new Exception("Could not open codec");
>
>         AVFrame* pDecodedFrame = FFmpegInvoke.avcodec_alloc_frame();
>
>         var packet = new AVPacket();
>         AVPacket* pPacket = &packet;
>         FFmpegInvoke.av_init_packet(pPacket);
>
>         int frameNumber = 0;
>         while (true)
>         {
>             Console.WriteLine("frame: {0}", frameNumber);
>
>             if (FFmpegInvoke.av_read_frame(pFormatContext, pPacket) < 0)
>                 throw new Exception("Could not read frame");
>
>             if (pPacket->stream_index != pStream->index)
>                 continue;
>
>             int gotPicture = 0;
>             int size = FFmpegInvoke.avcodec_decode_video2(pCodecContext, pDecodedFrame, &gotPicture, pPacket);
>             if (size < 0)
>                 throw new Exception(string.Format("Error while decoding frame {0}", frameNumber));
>
>             if (gotPicture == 1)
>             {
>                 byte** src = &pDecodedFrame->data_0;
>                 byte** dst = &pConvertedFrame->data_0;
>                 FFmpegInvoke.sws_scale(pConvertContext, src, pDecodedFrame->linesize, 0,
>                                         height, dst, pConvertedFrame->linesize);
>
>                 byte* convertedFrameAddress = pConvertedFrame->data_0;
>
>                 var imageBufferPtr = new IntPtr(convertedFrameAddress);
>
>                 using (var bitmap = new Bitmap(width, height, pConvertedFrame->linesize[0], PixelFormat.Format24bppRgb, imageBufferPtr))
>                 {
>                     bitmap.Save(@"frame.buffer.jpg", ImageFormat.Jpeg);
>                 }
>             }
>             //frameNumber++;
>         }
>
>         FFmpegInvoke.av_free(pConvertedFrame);
>         FFmpegInvoke.av_free(pConvertedFrameBuffer);
>         FFmpegInvoke.sws_freeContext(pConvertContext);
>
>         FFmpegInvoke.av_free(pDecodedFrame);
>         FFmpegInvoke.avcodec_close(pCodecContext);
>         FFmpegInvoke.avformat_close_input(&pFormatContext);
>
> How use hardware acceleration for decoding stream(hwaccel)?
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
>
>


-- 
Regards,
Dmitry
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20141121/caab0a8b/attachment.html>


More information about the Libav-user mailing list