⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pframecoder.asv

📁 用matlab写的仿真H.263标准的程序
💻 ASV
字号:
function [NextRFrameY, NextRFrameU, NextRFrameV] = PFrameCoder(FrameY, FrameU, FrameV,...
                                                   RFrameY,RFrameU,RFrameV,...
                                                   StructParameter)
%h263 P Frame 编码
%输入 FrameY,FrameU,FrameV:原始图像数据,uint8
%输入 RFrameY,RFrameU,RFrameV:参考图像数据,uint8
%输入 StructParameter: 
%          Qp:    QP
%       ImageRow: 图像行数(uint32)
%       ImageCol: 图像列数(uint32)
%     resolution: 图像分辨率 'cif' 'pal'
%       framenum: 总共需编码帧数
%输出 NextRFrameY,NextRFrameU,NextRFrameV,重建帧,uint8                        
% 

msg = nargchk(7,7,nargin);

if ~(isempty(msg)) %检查输入参数是否为7个
    disp(msg)
    return ;
end

Qp = StructParameter.Qp;
ImageRow = StructParameter.ImageRow;
ImageCol = StructParameter.ImageCol;
skipnumber = 0;
total_cbp = 0;
%边界填充
RFrameY = padarray(RFrameY,[16 16],'replicate','both');
RFrameU = padarray(RFrameU,[8 8],'replicate','both');
RFrameV = padarray(RFrameV,[8 8],'replicate','both');

for i = 1:ImageRow/16
    for j = 1:ImageCol/16
    
    %得到要处理宏块
    MBlockY = GetMacroBlockFromFrame(FrameY,i,j); %返回16x16 uint8
    BlockU = GetBlockFromFrame(FrameU,i,j);%返回8x8 uint8
    BlockV = GetBlockFromFrame(FrameV,i,j);%返回8x8 uint8
    %得到参考窗口
    RWindowsY = GetWindowsFromRFrame(RFrameY,i,j,'Y48'); %返回48x48 uint8
    RWindowsU = GetWindowsFromRFrame(RFrameU,i,j,'UV24');%返回24x24 uint8
    RWindowsV = GetWindowsFromRFrame(RFrameV,i,j,'UV24');%返回24x24 uint8  
    
    %运动搜索
    [vector_r,vector_c] = MacroMotionSearch(MBlockY,RWindowsY,48,48);
    %运动补偿
    [ResidualY,ResidualU,ResidualV] = MotionCompensate(RWindowsY,MBlockY,...
                                      RWindowsU,BlockU,RWindowsV,BlockV,...
                                      vector_r,vector_c);
   %dct2 变换
    MBCoeffY = MacroDct2(ResidualY);
    BCoeffU = BlockDct2(ResidualU);
    BCoeffV = BlockDct2(ResidualV);
    %quant
    MBQCoeffY = MacroQuant(MBCoeffY,Qp);
    BQCoeffU = BlockQuant263(BCoeffU,Qp);
    BQCoeffV = BlockQuant263(BCoeffV,Qp);
    %计算skip 数
    cbp = CalCbp(MBQCoeffY,BQCoeffU,BQCoeffV);
    total_cbp = total_cbp + cbp; 
    total_vector_r_nonzeros = total_vector_r_nonzeros + any(vector_r);
    skipnumber = skipnumber + IsSkip(vector_r,vector_c,cbp);
    %dequant
    RMBCoeffY = MacroDeQuant(MBQCoeffY,Qp);
    RBCoeffU = BlockDeQuant263(BQCoeffU,Qp);
    RBCoeffV = BlockDeQuant263(BQCoeffV,Qp);
    %idct2
    RMBDataY = MacroIDct2(RMBCoeffY);
    RBDataU = BlockIDct2(RBCoeffU);
    RBDataV = BlockIDct2(RBCoeffV);  
    %重建宏块数据
    [ReconMBY,ReconBU,ReconBV] = ReconMB(RWindowsY,RMBDataY,...
                                 RWindowsU,RBDataU,RWindowsV,RBDataV,...
                                 vector_r,vector_c);
    %debug 
%     MBlockY(1:8,1:8)
%     imshow(MBlockY(1:8,1:8))
%     figure
%     imshow(RWindowsY(vector_r+17:vector_r + 17 + 7,vector_c+17:vector_c + 17 + 7))
%     ResidualY(1:8,1:8)
%     MBCoeffY(1:8,1:8)
%     MBQCoeffY(1:8,1:8)
%     ReconMBY(1:8,1:8)
%     figure
%     imshow(uint8(ReconMBY(1:8,1:8)))
%     return;
    
    %保存重建宏块
    rindex_mrow = (i - 1) * 16 + 1;
    rindex_mcol = (j - 1) * 16 + 1;
    NextRFrameY(rindex_mrow:rindex_mrow + 15,rindex_mcol:rindex_mcol + 15) = uint8(ReconMBY);
    rindex_brow = (i - 1) * 8 + 1;
    rindex_bcol = (j - 1) * 8 + 1;    
    NextRFrameU(rindex_brow:rindex_brow + 7,rindex_bcol:rindex_bcol + 7) = uint8(ReconBU);
    NextRFrameV(rindex_brow:rindex_brow + 7,rindex_bcol:rindex_bcol + 7) = uint8(ReconBV);
             
    end
end
%debug
total_cbp
skipnumber

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -