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()函数,完成了解码操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值