Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 2039fdff authored by DIB Elian's avatar DIB Elian
Browse files

Simplify read, write and encoding

parent 4c9eaa75
No related branches found
No related tags found
No related merge requests found
function HEVCParams = LFtoHEVC(varargin)
function HEVCParams = LFtoHEVC(imgSize,imgRes,varargin)
%LFTOHEVC Convert lightfield parameters to HEVC parameters
% HEVCParams = LFtoHEVC(varargin)
defRefDir = fullfile(pwd,'Ref');
defRecDir = fullfile(pwd,'Rec');
refFilename = fullfile(pwd,'sequence_ref');
recFilename = fullfile(pwd,'sequence_rec');
switch imgSize(3)
case 1
subSamp = '400';
case 3
subSamp = '444';
otherwise
error('Unexpected number of channels');
end
p = inputParser; p.StructExpand = true; p.KeepUnmatched = true;
p.addParameter('name' , 'sequence', @ischar);
p.addParameter('refDir' , defRefDir , @ischar);
p.addParameter('recDir' , defRecDir , @ischar);
p.addParameter('encode' , true , @islogical);
p.addParameter('decode' , true , @islogical);
p.addParameter('InputBitDepth' , '8' , @ischar);
p.addParameter('OutputBitDepth', '8' , @ischar);
p.addParameter('refFilename' , refFilename, @ischar);
p.addParameter('recFilename' , recFilename, @ischar);
p.addParameter('subSamp' , subSamp , @ischar);
p.addParameter('InputBitDepth' , '8' , @ischar);
p.addParameter('OutputBitDepth', '8' , @ischar);
p.addParameter('encode' , true , @islogical);
p.addParameter('decode' , true , @islogical);
p.parse(varargin{:});
name = p.Results.name;
refDir = p.Results.refDir;
recDir = p.Results.recDir;
encode = p.Results.encode;
decode = p.Results.decode;
refFilename = p.Results.refFilename;
recFilename = p.Results.recFilename;
subSamp = p.Results.subSamp;
InputBitDepth = p.Results.InputBitDepth;
OutputBitDepth = p.Results.OutputBitDepth;
m = utils.getMat(refDir,name,false);
n = utils.getMat(recDir,name,true);
n.yuvSize = m.yuvSize;
n.LFSize = m.LFSize;
n.subSamp = m.subSamp;
n.readPrecision = m.readPrecision;
n.writePrecision = m.writePrecision;
n.name = m.name;
n.refDir = m.refDir;
yuvSize = m.yuvSize;
imgRes = yuvSize(1:2);
imgSize = yuvSize(3:end);
subSamp = m.subSamp;
encode = p.Results.encode;
decode = p.Results.decode;
HEVCParams.encode = encode;
HEVCParams.decode = decode;
HEVCParams.InputFile = yuv.conventionName(refDir,name,imgSize,subSamp,InputBitDepth,'.yuv');
HEVCParams.ReconFile = yuv.conventionName(recDir,name,imgSize,subSamp,OutputBitDepth,'.yuv');
HEVCParams.BitstreamFile = yuv.conventionName(recDir,name,imgSize,subSamp,InputBitDepth,'.hevc');
HEVCParams.InputFile = yuv.params2name(refFilename,imgSize,subSamp,InputBitDepth ,'.yuv');
HEVCParams.ReconFile = yuv.params2name(recFilename,imgSize,subSamp,OutputBitDepth,'.yuv');
HEVCParams.BitstreamFile = yuv.params2name(recFilename,imgSize,subSamp,InputBitDepth ,'.hevc');
HEVCParams.SourceWidth = num2str(imgSize(2));
HEVCParams.SourceHeight = num2str(imgSize(1));
HEVCParams.FramesToBeEncoded = num2str(prod(imgRes));
HEVCParams.InputChromaFormat = num2str(subSamp);
HEVCParams.InputChromaFormat = subSamp;
end
\ No newline at end of file
......@@ -8,24 +8,30 @@ end
LFRec = LFRef;
defRefDir = fullfile(pwd,'Ref');
defRecDir = fullfile(pwd,'Rec');
[~,defBitDepth] = utils.precision(class(LFRef));
refFilename = fullfile(pwd,'sequence_ref');
recFilename = fullfile(pwd,'sequence_rec');
[~,bitDepth] = utils.precision(class(LFRef));
switch size(LFRef,3)
case 1
subSamp = '400';
case 3
subSamp = '444';
otherwise
error('Unexpected number of channels');
end
% Create input parser scheme
p = inputParser; p.StructExpand = true; p.KeepUnmatched = true;
p.addParameter('inColSpace' , 'rgb' , @ischar);
p.addParameter('outColSpace' , 'ycbcr' , @ischar);
p.addParameter('subSamp' , '444' , @ischar);
p.addParameter('readPrecision' , class(LFRef) , @ischar);
p.addParameter('writePrecision', class(LFRef) , @ischar);
p.addParameter('bitDepth' , defBitDepth , @isnumeric);
p.addParameter('name' , 'sequence' , @ischar);
p.addParameter('refDir' , defRefDir , @ischar);
p.addParameter('recDir' , defRecDir , @ischar);
p.addParameter('padding' , true , @islogical);
p.addParameter('encode' , true , @islogical);
p.addParameter('decode' , true , @islogical);
p.addParameter('refFilename', refFilename, @ischar);
p.addParameter('recFilename', recFilename, @ischar);
p.addParameter('subSamp' , subSamp , @ischar);
p.addParameter('bitDepth' , bitDepth , @isnumeric);
p.addParameter('inColSpace' , 'rgb' , @ischar);
p.addParameter('outColSpace', 'ycbcr' , @ischar);
p.addParameter('padding' , true , @islogical);
p.addParameter('encode' , true , @islogical);
p.addParameter('decode' , true , @islogical);
% Parse arguments
p.parse(varargin{:});
......@@ -33,6 +39,7 @@ p.parse(varargin{:});
LFParams = p.Results;
HEVCParams = p.Unmatched;
% Bit depth
if ~isfield(HEVCParams,'InputBitDepth')
HEVCParams.InputBitDepth = num2str(LFParams.bitDepth);
end
......@@ -41,40 +48,35 @@ if ~isfield(HEVCParams,'OutputBitDepth')
HEVCParams.OutputBitDepth = HEVCParams.InputBitDepth;
end
if ~exist(LFParams.refDir,'dir')
mkdir(LFParams.refDir);
end
% Overwrite LF bit depth with HEVC bit depth
LFParams.bitDepth = str2double(HEVCParams.InputBitDepth);
LFParams.bitDepth = str2double(HEVCParams.OutputBitDepth);
if ~exist(LFParams.recDir,'dir')
mkdir(LFParams.recDir);
% Make sure folders exist
refDir = fileparts(LFParams.refFilename);
if ~exist(refDir,'dir')
mkdir(refDir);
end
% Writing
inputBitDepth = HEVCParams.InputBitDepth;
writePrecision = ['ubit',inputBitDepth];
[~,~,writePrecision] = utils.precision(writePrecision);
LFParams.writePrecision = writePrecision;
LFParams.bitDepth = str2double(inputBitDepth);
recDir = fileparts(LFParams.recFilename);
if ~exist(recDir,'dir')
mkdir(recDir);
end
% Write input yuv file
if LFParams.encode
LF.write(LFRef,LFParams);
[imgSize,imgRes] = LF.write(LFRef,LFParams,'filename',LFParams.refFilename);
end
% Convert inputs for HEVC
LFHEVCParams = LF.LFtoHEVC(LFParams,HEVCParams);
LFHEVCParams = LF.LFtoHEVC(imgSize,imgRes,LFParams,HEVCParams);
% Encode frames using HEVC
[nbBits,peaksnr] = HEVC.codec(LFHEVCParams,HEVCParams);
% Reading
outputBitDepth = HEVCParams.OutputBitDepth;
writePrecision = ['ubit',outputBitDepth];
[~,~,writePrecision] = utils.precision(writePrecision);
LFParams.writePrecision = writePrecision;
LFParams.bitDepth = str2double(outputBitDepth);
% Read output yuv file
if LFParams.decode
LFRec = LF.read(LFParams);
LFRec = LF.read(imgSize,imgRes,LFParams,'filename',LFParams.recFilename);
end
end
\ No newline at end of file
function [LFRec,nbBits,peaksnr] = decode(varargin)
%CODEC Summary of this function goes here
% Detailed explanation goes here
colSpaces = {'rgb','ycbcr'};
subSamps = {'400','420','444','422'};
precisions = {'uint8','uint16','single','double'};
refDir = fullfile(pwd,'Ref');
recDir = fullfile(pwd,'Rec');
% Create input parser scheme
p = inputParser; p.StructExpand = true; p.KeepUnmatched = true;
p.addParameter('inColSpace' ,colSpaces{1} ,@(x) any(validatestring(x,colSpaces )));
p.addParameter('outColSpace' ,colSpaces{2} ,@(x) any(validatestring(x,colSpaces )));
p.addParameter('subSamp' ,subSamps{1} ,@(x) any(validatestring(x,subSamps )));
p.addParameter('readPrecision' ,precisions{1},@(x) any(validatestring(x,precisions)));
p.addParameter('writePrecision',precisions{1},@(x) any(validatestring(x,precisions)));
p.addParameter('name' ,'sequence' ,@ischar);
p.addParameter('refDir' ,refDir ,@ischar);
p.addParameter('recDir' ,recDir ,@ischar);
p.addParameter('padding' ,true ,@islogical);
% Parse arguments
p.parse(varargin{:});
LFParams = p.Results;
extraHEVCParams = p.Unmatched;
% if ~exist(LFParams.refDir,'dir')
% mkdir(LFParams.refDir);
% end
if ~exist(LFParams.recDir,'dir')
mkdir(LFParams.recDir);
end
% Writing
% LF.write(LFRef,LFParams);
% Convert inputs for HEVC
HEVCParams = LF.LFtoHEVC(LFParams);
% Encode frames using HEVC
[nbBits,peaksnr] = HEVC.decode(HEVCParams,extraHEVCParams);
% Reading
LFRec = LF.read(LFParams);
end
\ No newline at end of file
function [nbBits,peaksnr] = encode(LFRef,varargin)
%CODEC Summary of this function goes here
% Detailed explanation goes here
colSpaces = {'rgb','ycbcr'};
subSamps = {'400','420','444','422'};
precisions = {'uint8','uint16','single','double'};
refDir = fullfile(pwd,'Ref');
recDir = fullfile(pwd,'Rec');
% Create input parser scheme
p = inputParser; p.StructExpand = true; p.KeepUnmatched = true;
p.addParameter('inColSpace' ,colSpaces{1} ,@(x) any(validatestring(x,colSpaces )));
p.addParameter('outColSpace' ,colSpaces{2} ,@(x) any(validatestring(x,colSpaces )));
p.addParameter('subSamp' ,subSamps{1} ,@(x) any(validatestring(x,subSamps )));
p.addParameter('readPrecision' ,class(LFRef) ,@(x) any(validatestring(x,precisions)));
p.addParameter('writePrecision',class(LFRef) ,@(x) any(validatestring(x,precisions)));
p.addParameter('name' ,'sequence' ,@ischar);
p.addParameter('refDir' ,refDir ,@ischar);
p.addParameter('recDir' ,recDir ,@ischar);
p.addParameter('padding' ,true ,@islogical);
% Parse arguments
p.parse(varargin{:});
LFParams = p.Results;
extraHEVCParams = p.Unmatched;
if ~exist(LFParams.refDir,'dir')
mkdir(LFParams.refDir);
end
if ~exist(LFParams.recDir,'dir')
mkdir(LFParams.recDir);
end
% Writing
LF.write(LFRef,LFParams);
% Convert inputs for HEVC
HEVCParams = LF.LFtoHEVC(LFParams);
% Encode frames using HEVC
[nbBits,peaksnr] = HEVC.encode(HEVCParams,extraHEVCParams);
% Reading
% LFRec = LF.read(LFParams);
end
\ No newline at end of file
function [LFRec,nbBits,peaksnr] = encodedecode(LFRef,varargin)
%CODEC Summary of this function goes here
% Detailed explanation goes here
colSpaces = {'rgb','ycbcr'};
subSamps = {'400','420','444','422'};
precisions = {'uint8','uint16','single','double'};
refDir = fullfile(pwd,'Ref');
recDir = fullfile(pwd,'Rec');
% Create input parser scheme
p = inputParser; p.StructExpand = true; p.KeepUnmatched = true;
p.addParameter('inColSpace' ,colSpaces{1} ,@(x) any(validatestring(x,colSpaces )));
p.addParameter('outColSpace' ,colSpaces{2} ,@(x) any(validatestring(x,colSpaces )));
p.addParameter('subSamp' ,subSamps{1} ,@(x) any(validatestring(x,subSamps )));
p.addParameter('readPrecision' ,class(LFRef) ,@(x) any(validatestring(x,precisions)));
p.addParameter('writePrecision',class(LFRef) ,@(x) any(validatestring(x,precisions)));
p.addParameter('name' ,'sequence' ,@ischar);
p.addParameter('refDir' ,refDir ,@ischar);
p.addParameter('recDir' ,recDir ,@ischar);
p.addParameter('padding' ,true ,@islogical);
% Parse arguments
p.parse(varargin{:});
LFParams = p.Results;
extraHEVCParams = p.Unmatched;
if ~exist(LFParams.refDir,'dir')
mkdir(LFParams.refDir);
end
if ~exist(LFParams.recDir,'dir')
mkdir(LFParams.recDir);
end
% Writing
LF.write(LFRef,LFParams);
% Convert inputs for HEVC
HEVCParams = LF.LFtoHEVC(LFParams);
% Encode frames using HEVC
[nbBits,peaksnr] = HEVC.encodedecode(HEVCParams,extraHEVCParams);
% Reading
LFRec = LF.read(LFParams);
end
\ No newline at end of file
function LFRec = read(varargin)
function LFRec = read(imgSize,imgRes,varargin)
%READ Read lightfield 4D(u,v,x,y) data from yuv file
% LFRec = read(varargin)
defRecDir = fullfile(pwd,'Rec');
filename = fullfile(pwd,'sequence');
% Create input parser scheme
p = inputParser; p.StructExpand = true; p.KeepUnmatched = true;
p.addParameter('recDir' , defRecDir , @ischar);
p.addParameter('name' , 'sequence' , @ischar);
p.addParameter('padding' , false , @islogical);
p.addParameter('filename', filename, @ischar);
p.addParameter('padding' , false , @islogical);
% Parse arguments
p.parse(varargin{:});
params = p.Results;
m = utils.getMat(params.recDir,params.name,false);
LFSize = m.LFSize;
%filename = p.Results.filename;
padding = p.Results.padding;
% Recover frames
frames = yuv.read(varargin{:});
frames = yuv.read(imgSize,imgRes,varargin{:});
% Recover LF
LFRec = LF.join(frames);
if params.padding
LFRec = LF.unpad(LFRec,LFSize);
if padding
LFRec = LF.unpad(LFRec,[imgSize,imgRes]);
end
end
\ No newline at end of file
function [LFSize,yuvSize] = write(LFRef,varargin)
function [imgSize,imgRes] = write(LFRef,varargin)
%WRITE Write lightfield 4D(u,v,x,y) data to yuv file
% [LFSize,yuvSize] = WRITE(LFRef,varargin)
defRefDir = fullfile(pwd,'Ref');
filename = fullfile(pwd,'sequence');
% Create input parser scheme
p = inputParser; p.StructExpand = true; p.KeepUnmatched = true;
p.addParameter('refDir' , defRefDir , @ischar);
p.addParameter('name' , 'sequence' , @ischar);
p.addParameter('padding' , false , @islogical);
p.addParameter('filename', filename, @ischar);
p.addParameter('padding' , false , @islogical);
% Parse arguments
p.parse(varargin{:});
params = p.Results;
filename = p.Results.filename;
padding = p.Results.padding;
if ~exist(params.refDir,'dir')
mkdir(params.refDir);
end
m = utils.getMat(params.refDir,params.name,true);
LFSize = size(LFRef);
m.LFSize = LFSize;
imgSize = LFSize(1:3);
imgRes = LFSize(4:end);
m = utils.getMat(filename,true);
m.imgSize = imgSize;
m.imgRes = imgRes;
if params.padding
if padding
LFRef = LF.pad(LFRef,8);
end
......@@ -30,6 +30,6 @@ end
frames = LF.split(LFRef);
% Write frames as a YUV sequence
yuvSize = yuv.write(frames,varargin{:});
yuv.write(frames,varargin{:});
end
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment