📄 pframecoder.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 + -