`

ffmpeg 源代码简单分析 : avcodec_decode_video2()

 
阅读更多

 

此前写了好几篇ffmpeg源代码分析文章,列表如下:

图解FFMPEG打开媒体的函数avformat_open_input
ffmpeg 源代码简单分析 : av_register_all()
ffmpeg 源代码简单分析 : avcodec_register_all()
ffmpeg 源代码简单分析 : av_read_frame()
ffmpeg 源代码简单分析 : avcodec_decode_video2()

============================

 

ffmpeg中的avcodec_decode_video2()的作用是解码一帧视频数据。输入一个压缩编码的结构体AVPacket,输出一个解码后的结构体AVFrame。

 

查看源代码之后发现,这个函数竟然十分的简单,源代码如下:

 

int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
                         int *got_picture_ptr,
                         const AVPacket *avpkt)
{
    int ret;
    // copy to ensure we do not change avpkt
    AVPacket tmp = *avpkt;

    *got_picture_ptr= 0;
    if((avctx->coded_width||avctx->coded_height) && av_image_check_size(avctx->coded_width, avctx->coded_height, 0, avctx))
        return -1;

    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size || (avctx->active_thread_type&FF_THREAD_FRAME)){
        int did_split = av_packet_split_side_data(&tmp);
        apply_param_change(avctx, &tmp);
        avctx->pkt = &tmp;
        if (HAVE_THREADS && avctx->active_thread_type&FF_THREAD_FRAME)
             ret = ff_thread_decode_frame(avctx, picture, got_picture_ptr,
                                          &tmp);
        else {
            ret = avctx->codec->decode(avctx, picture, got_picture_ptr,
                              &tmp);
            picture->pkt_dts= avpkt->dts;

            if(!avctx->has_b_frames){
            picture->pkt_pos= avpkt->pos;
            }
            //FIXME these should be under if(!avctx->has_b_frames)
            if (!picture->sample_aspect_ratio.num)
                picture->sample_aspect_ratio = avctx->sample_aspect_ratio;
            if (!picture->width)
                picture->width = avctx->width;
            if (!picture->height)
                picture->height = avctx->height;
            if (picture->format == PIX_FMT_NONE)
                picture->format = avctx->pix_fmt;
        }

        emms_c(); //needed to avoid an emms_c() call before every return;

        avctx->pkt = NULL;
        if (did_split)
            ff_packet_free_side_data(&tmp);

        if (*got_picture_ptr){
            avctx->frame_number++;
            picture->best_effort_timestamp = guess_correct_pts(avctx,
                                                            picture->pkt_pts,
                                                            picture->pkt_dts);
        }
    }else
        ret= 0;

    return ret;
}

 

从代码中可以看出,通过ret = avctx->codec->decode(avctx, picture, got_picture_ptr,&tmp)这句代码,调用了相应解码器的decode()函数,完成了解码操作。

 

 

分享到:
评论

相关推荐

    output_example.rar_FFmpeg解码_ffmpeg_ffmpeg 编译_output exmple_outpu

    5. **解码数据**:循环读取输入流的packet(`av_read_frame()`),然后使用`avcodec_decode_video2()`或`avcodec_decode_audio4()`进行解码。 6. **处理解码后的数据**:解码成功后,会返回解码后的AVFrame,从中...

    avcodec_sample.rar_DEMO

    在"avcodec_sample.cpp"源代码中,这些步骤应该被清晰地实现。同时,"pudn.txt"可能是项目的一些说明或者开发过程中的笔记,可能包含对DEMO运行的额外指导或注意事项。 总的来说,这个DEMO提供了一个基本的框架,...

    内存H264+PCM发布rtmp.rar

    使用FFmpeg API可以简化多媒体处理的复杂性,比如使用`avcodec_decode_video2()`解码H264数据,`avcodec_encode_audio2()`编码PCM数据,`avformat_write_header()`和`av_interleaved_write_frame()`写入FLV容器。...

    ffmpeg_dsl_camera.rar_55_ffmpeg_ffmpeg 64_ffmpeg camera_ffmpeg 库

    这个压缩包"ffmpeg_dsl_camera.rar_55_ffmpeg_ffmpeg 64_ffmpeg camera_ffmpeg 库"包含了与使用 FFmpeg 读取和显示来自DSL相机的视频流相关的源代码。FFmpeg 的版本是55,这通常指的是其主版本号,它可能包括了多个...

    ffmpeg使用dxva2硬解码DEMO(vs2010)

    为了在VS2010项目中集成FFmpeg,你需要下载FFmpeg源代码,并将其添加到你的项目中。这通常涉及设置头文件和库文件的路径,确保编译器能够找到必要的依赖项。同时,你需要确保你的系统支持并启用了DXVA2。 接下来,...

    FFmpeg源代码结构图 - 解码.rar

    4. **解码数据**:调用`avcodec_decode_video2()`或`avcodec_decode_audio4()`函数进行解码。这个过程会分析编码数据,去除各种编码技术,如熵编码、运动补偿等,还原出原始的像素或样本。 5. **检查结果**:解码后...

    sunwukong.rar_ffmpeg_ffmpeg例子_ffmpeg转码_转码

    在这个"sunwukong.rar"压缩包中,我们有一个名为"sunwukong.cpp"的源代码文件,这很可能是用C++编写的,展示了如何使用FFmpeg进行视频或音频的转码操作。 首先,`ffmpeg`命令行工具是FFmpeg的核心部分,它提供了对...

    FFmpeg-master.zip_FFmpeg-master_ffmpeg_ffmpeg 播放

    "FFmpeg-master.zip" 是 FFmpeg 源代码的压缩包,"FFmpeg-master" 是源代码仓库的主目录,而 "ffmpeg_ffmpeg 播放" 指的是使用 FFmpeg 进行视频播放的相关示例。 在 FFmpeg 中,播放视频主要涉及到以下几个关键步骤...

    FFMPEG_apiexample.c_随机

    在 `FFMPEG_apiexample.c` 示例中,源代码可能保持了 FFmpeg API 的基本结构,没有进行大规模修改,因此是学习 FFmpeg 编解码操作的良好起点。通过阅读和理解这段代码,开发者可以深入理解 FFmpeg 如何处理音频和...

    Qt5.5 使用FFmpeg3.4 开发库 完美环境搭建

    例如,使用`avformat_open_input`打开一个媒体文件,`avformat_find_stream_info`获取流信息,然后`avcodec_decode_audio4`或`avcodec_decode_video2`进行解码。 7. **调试和测试**: 编译并运行你的Qt项目,确保...

    最简单的基于FFMPEG的转码器(源代码)

    通过分析和实践这个简单的FFMPEG转码器源代码,开发者能够深入理解FFmpeg的工作原理,并在此基础上开发更复杂的多媒体处理应用,如视频编辑软件、直播推流服务等。同时,学习FFmpeg还能帮助开发者应对不同的多媒体...

    IOS_ffmpeg3.2.1(带X264库)

    在iOS平台,由于安全性和沙箱机制,直接使用源代码编译FFmpeg可能面临一些挑战。这个压缩包提供的预编译库解决了这个问题,适用于模拟器和真机,这意味着开发者可以直接将这些库集成到自己的iOS项目中,而无需从...

    QQ影音修改后的ffmpeg源代码

    然后,可以通过阅读关键函数和模块,如`avformat_open_input`、`avformat_find_stream_info`、`avcodec_decode_video2`等,来理解QQ影音如何与ffmpeg交互,处理输入的音视频流。 此外,修改后的源代码可能包含了...

    ffmpeg_mp4_ffmpegMP4_

    6. 解码视频和音频帧:使用`avcodec_decode_video2()`或`avcodec_decode_audio4()`进行解码,得到`AVFrame`对象。 7. 创建输出文件的`AVFormatContext`:使用`avformat_alloc_output_context2()`创建一个新的`...

    ffmpeg_read_ffmpeg_

    - 打包和编译FFmpeg:初学者可能需要了解如何配置和编译FFmpeg源代码,以便在项目中使用。 以上就是从给定的标题和描述中可以推测出的主要知识点。具体的实现细节,例如如何解析和显示每一帧,以及如何处理解码...

    Android ffmpeg库

    - 视频解码:使用 avformat_open_input() 打开文件,avformat_find_stream_info() 获取流信息,avcodec_find_decoder() 寻找解码器,avcodec_open2() 初始化解码器,avcodec_decode_video2() 进行解码。 - 音频...

    FFmpeg_08_解码及逐帧编码

    一旦准备就绪,可以使用`avcodec_decode_video2()`或`avcodec_decode_audio4()`函数进行实际的解码操作,将字节流解码为`AVFrame`结构,其中包含了视频帧的数据。 逐帧编码,顾名思义,是指对视频的每一帧进行独立...

    ffmpeg编译包

    这通常涉及到下载FFmpeg源代码、配置Android NDK、设置目标平台及ABI(armeabi, armeabi-v7a, arm64-v8a, x86, x86_64)等步骤。 2. 编译过程: - 配置NDK路径:确保你的开发环境中已经安装了Android NDK,并设置...

    FFmpegAPI使用手册

    2. 解码:`av_read_frame`读取一帧数据,`avcodec_decode_video2`或`avcodec_decode_audio4`进行解码。 3. 处理解码后的数据:解码后的AVFrame可以使用libavfilter进行处理,例如添加水印、裁剪等。 4. 再编码与...

    FFmpeg cpp 实例代码

    在FFmpeg_CPP-master这个压缩包中,你将找到一系列C++源代码,这些代码展示了如何通过FFmpeg API进行常见的音视频操作,如读取、解码、显示和保存媒体文件。以下是一些关键知识点: 1. **FFmpeg库的包含**:在C++...

Global site tag (gtag.js) - Google Analytics