Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 271def9b authored by Unknown's avatar Unknown
Browse files

Initial commit

parents
No related branches found
No related tags found
No related merge requests found
classdef Viewer < handle
%VIEWER Summary of this class goes here
% Detailed explanation goes here
properties(SetObservable, AbortSet)
data
name = 'LightField'
state = 'uv'
range = 'Default'
cv = [1,1]
end
properties
h = []
im = []
ax = []
slices
end
properties(Dependent, Hidden)
state_
range_
end
methods
function obj = Viewer(varargin)
validStates = {'xy','uv','ux','vy'};
validRanges = {'Default','Local','Global'};
p = inputParser();
p.addRequired('data');
p.addOptional('name' , obj.name ,@ischar);
p.addOptional('state', obj.state ,@(state) any(strcmp(state,validStates)));
p.addOptional('range', obj.range ,@(range) any(strcmp(range,validRanges)));
p.parse(varargin{:});
addlistener(obj,'data' ,'PostSet' ,@(src,evnt) obj.updateSlices);
addlistener(obj,'state' ,'PostSet' ,@(src,evnt) obj.updateSlices);
res = p.Results;
for fname = fieldnames(res)'
fn = fname{:};
obj.(fn) = res.(fn);
end
addlistener(obj,'cv' ,'PostSet' ,@(src,evnt) obj.updateFigure);
addlistener(obj,'range' ,'PostSet' ,@(src,evnt) obj.updateFigure);
addlistener(obj,'name' ,'PostSet' ,@(src,evnt) obj.updateFigure);
end
function state_ = get.state_(obj)
switch obj.state
case 'xy'
state_ = [0 0 1 1 0];
case 'uv'
state_ = [1 1 0 0 0];
case 'ux'
state_ = [1 0 1 0 0];
case 'vy'
state_ = [0 1 0 1 0];
otherwise
warning('Unknown state');
state_ = [1 1 0 0 0];
end
end
function range_ = get.range_(obj)
switch obj.range
case 'Default'
typename = class(obj.data);
type = utils.precision(typename);
switch type
case {'int','uint'}
range_ = [intmin(typename) intmax(typename)];
case {'float','single','double'}
range_ = [0 1];
end
case 'Local'
u=obj.cv(1); v=obj.cv(2);
slice = obj.slices{u,v};
range_ = [min(slice(:)) max(slice(:))];
case 'Global'
range_ = [min(obj.data(:)) max(obj.data(:))];
otherwise
warning('Unknown range');
range_ = [0 1];
end
end
function updateSlices(obj)
obj.slices = LF.split(obj.data,obj.state_);
end
function updateFigure(obj)
sz = size(obj.slices);
obj.cv = min(sz,max([1,1],obj.cv));
u=obj.cv(1); v=obj.cv(2);
if obj.validFigure()
obj.im.CData = obj.slices{u,v};
title_{1} = obj.name;
title_{2} = ['Coords = ' num2str(obj.cv(1)) ', ' num2str(obj.cv(2))];
title(title_);
obj.ax.CLim = obj.range_;
end
end
function view(obj)
if ~obj.validFigure()
obj.h = figure;
obj.im = imshow(obj.slices{1,1});
obj.ax = gca;
obj.h.KeyPressFcn = @obj.KeyPressCallback;
obj.updateFigure();
end
end
function KeyPressCallback(obj,~,evnt)
persistent rangeInd
ranges = {'Default','Local','Global'};
if isempty(rangeInd)
rangeInd=0;
end
cv_ = obj.cv;
switch evnt.Key
case 'uparrow'
cv_(1) = cv_(1)-1;
case 'downarrow'
cv_(1) = cv_(1)+1;
case 'leftarrow'
cv_(2) = cv_(2)-1;
case 'rightarrow'
cv_(2) = cv_(2)+1;
case 'space'
rangeInd = mod(rangeInd+1,3);
end
sz = size(obj.slices);
obj.cv = min(sz,max([1,1],cv_));
obj.range = ranges{1+rangeInd};
end
function bool = validFigure(obj)
bool = ~isempty(obj.h)&&isvalid(obj.h)&&...
~isempty(obj.ax)&&isvalid(obj.ax)&&...
~isempty(obj.im)&&isvalid(obj.im);
end
end
end
+LF
decode.m 0 → 100644
function [LFRec,framesRec] = decode(name,imgRes,imgSize,varargin)
%DECODE Summary of this function goes here
% Detailed explanation goes here
colSpaces = {'rgb','ycbcr'};
subSamps = {'420','444','422','400'};
precisions = {'uint8','uint16','single','double'};
RefDir = fullfile(pwd,'Ref');
% 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('saveDir' ,pwd ,@ischar);
p.addParameter('refDir' ,RefDir ,@ischar);
% Parse arguments
p.parse(varargin{:});
yuvParams = p.Results;
extraParams = p.Unmatched;
if isfield(extraParams,'InputChromaFormat')
ICF = extraParams.InputChromaFormat;
SS = yuvParams.subSamp;
if ~strcmp(ICF,SS)
warning(['Conflicting SubSamp and InputChromaFormat parameters',...
' , choosing InputChromaFormat']);
yuvParams.subSamp = ICF;
end
end
refSubName = '_ref';
recSubName = '_rec';
refDir = yuvParams.refDir;
recDir = yuvParams.saveDir;
if ~(7==exist(refDir,'file'))
mkdir(refDir);
end
if ~(7==exist(recDir,'file'))
mkdir(recDir);
end
% [imgRes,imgSize,framesRef] = LF.write(LFRef,name,yuvParams,...
% 'subName',refSubName,...
% 'saveDir',refDir);
% Convert inputs for HEVC
% HEVCparams = extractHEVCParams(refDir,recDir,name,yuvParams);
% Encode frames using HEVC
% HEVC.encode(HEVCparams,extraParams);
[LFRec,framesRec] = LF.read(name,imgRes,imgSize,yuvParams,...
'subName',recSubName,...
'saveDir',recDir);
%% Auxiliary functions
function params = extractHEVCParams(refDir,recDir,name,yuvParams)
subSamp = yuvParams.subSamp;
resCell = num2cell(imgRes);
sizeCell = num2cell(imgSize);
fullName = [resCell,sizeCell];
fullName = cellfun(@num2str,fullName,'UniformOutput',false);
fullName = strjoin([name fullName subSamp],'_');
params.InputFile = fullfile(refDir,[fullName,refSubName,'.yuv']);
params.BitstreamFile = fullfile(recDir,[fullName, '.hevc']);
params.ReconFile = fullfile(recDir,[fullName,recSubName,'.yuv']);
params.LogFile = fullfile(recDir,[fullName, '.rtf']);
params.SourceWidth = num2str(imgSize(2));
params.SourceHeight = num2str(imgSize(1));
params.FramesToBeEncoded = num2str(prod(imgRes));
params.InputChromaFormat = num2str(subSamp);
end
end
encode.m 0 → 100644
function [LFRec,framesRef,framesRec] = encode(LFRef,name,varargin)
%CODEC Summary of this function goes here
% Detailed explanation goes here
colSpaces = {'rgb','ycbcr'};
subSamps = {'420','444','422','400'};
precisions = {'uint8','uint16','single','double'};
RefDir = fullfile(pwd,'Ref');
% 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('saveDir' ,pwd ,@ischar);
p.addParameter('refDir' ,RefDir ,@ischar);
% Parse arguments
p.parse(varargin{:});
yuvParams = p.Results;
extraParams = p.Unmatched;
if isfield(extraParams,'InputChromaFormat')
ICF = extraParams.InputChromaFormat;
SS = yuvParams.subSamp;
if ~strcmp(ICF,SS)
warning(['Conflicting SubSamp and InputChromaFormat parameters',...
' , choosing InputChromaFormat']);
yuvParams.subSamp = ICF;
end
end
refSubName = '_ref';
recSubName = '_rec';
refDir = yuvParams.refDir;
recDir = yuvParams.saveDir;
if ~(7==exist(refDir,'file'))
mkdir(refDir);
end
if ~(7==exist(recDir,'file'))
mkdir(recDir);
end
[imgRes,imgSize,framesRef] = LF.write(LFRef,name,yuvParams,...
'subName',refSubName,...
'saveDir',refDir);
% Convert inputs for HEVC
HEVCparams = extractHEVCParams(refDir,recDir,name,yuvParams);
% Encode frames using HEVC
HEVC.encode(HEVCparams,extraParams);
[LFRec,framesRec] = LF.read(name,imgRes,imgSize,yuvParams,...
'subName',recSubName,...
'saveDir',recDir);
%% Auxiliary functions
function params = extractHEVCParams(refDir,recDir,name,yuvParams)
subSamp = yuvParams.subSamp;
resCell = num2cell(imgRes);
sizeCell = num2cell(imgSize);
fullName = [resCell,sizeCell];
fullName = cellfun(@num2str,fullName,'UniformOutput',false);
fullName = strjoin([name fullName subSamp],'_');
params.InputFile = fullfile(refDir,[fullName,refSubName,'.yuv']);
params.BitstreamFile = fullfile(recDir,[fullName, '.hevc']);
params.ReconFile = fullfile(recDir,[fullName,recSubName,'.yuv']);
params.LogFile = fullfile(recDir,[fullName, '.rtf']);
params.SourceWidth = num2str(imgSize(2));
params.SourceHeight = num2str(imgSize(1));
params.FramesToBeEncoded = num2str(prod(imgRes));
params.InputChromaFormat = num2str(subSamp);
end
end
join.m 0 → 100644
function data = join(slices,varargin)
%JOIN Summary of this function goes here
% Detailed explanation goes here
splits = logical([1,1,0,0,0]);
if nargin>1
splits = logical(varargin{1});
end
sz(splits) = size(slices);
ss = size(slices{1}); ss(numel(ss)+1:3)=1;
sz(~splits) = ss;
joinDims = sz;
joinDims(splits) = 1;
splitDims = sz;
splitDims(~splits) = 1;
slices = cellfun(@(slice) reshape(slice,joinDims),slices,'UniformOutput',false);
slices = reshape(slices,splitDims);
data = cell2mat(slices);
end
read.m 0 → 100644
function [data,frames] = read(name,imgRes,imgSize,varargin)
%READ Summary of this function goes here
% Detailed explanation goes here
colSpaces = {'rgb','ycbcr'};
subSamps = {'420','444','422','400'};
precisions = {'uint8','uint16','single','double'};
% Create input parser scheme
p = inputParser; p.StructExpand = true; p.KeepUnmatched = true;
p.addParameter( 'inColSpace' ,'rgb' ,@(x) any(validatestring(x,colSpaces )));
p.addParameter('outColSpace' ,'ycbcr' ,@(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','uint8' ,@(x) any(validatestring(x,precisions)));
p.addParameter('subName' ,'' ,@ischar);
p.addParameter('saveDir' ,pwd ,@ischar);
% Parse arguments
p.parse(varargin{:});
params = p.Results;
% Recover frames
frames = yuv.read(name,imgRes,imgSize,params);
% Convert back
frames = yuv.convert(frames,params.inColSpace,params.outColSpace);
% Recover LF
data = LF.join(frames);
end
split.m 0 → 100644
function slices = split(data,varargin)
%SPLIT Summary of this function goes here
% Detailed explanation goes here
sz = size(data);
sz(numel(sz)+1:5)=1;
splits = logical([1,1,0,0,0]);
if nargin>1
splits = logical(varargin{1});
end
nsplits = sz;
nsplits(~splits) = 1;
splitDims = arrayfun(@(nsplit,sz) repelem(sz/nsplit,nsplit),...
nsplits,sz,...
'UniformOutput',false);
slices = mat2cell(data,splitDims{:});
slices = squeeze(slices);
slices = cellfun(@squeeze,slices,'UniformOutput',false);
end
write.m 0 → 100644
function [imgRes,imgSize,frames] = write(data,name,varargin)
%WRITE Summary of this function goes here
% Detailed explanation goes here
colSpaces = {'rgb','ycbcr'};
subSamps = {'420','444','422','400'};
precisions = {'uint8','uint16','single','double'};
% Create input parser scheme
p = inputParser; p.StructExpand = true; p.KeepUnmatched = true;
p.addParameter( 'inColSpace' ,'rgb' ,@(x) any(validatestring(x,colSpaces )));
p.addParameter('outColSpace' ,'ycbcr' ,@(x) any(validatestring(x,colSpaces )));
p.addParameter('subSamp' ,subSamps{1},@(x) any(validatestring(x,subSamps )));
p.addParameter( 'readPrecision',class(data),@(x) any(validatestring(x,precisions)));
p.addParameter('writePrecision',class(data),@(x) any(validatestring(x,precisions)));
p.addParameter('subName' ,'' ,@ischar);
p.addParameter('saveDir' ,pwd ,@ischar);
% Parse arguments
p.parse(varargin{:});
params = p.Results;
% Change 5D LF to a collection of 2D frames
frames = LF.split(data);
% Convert each frame according to given parameters
frames = yuv.convert(frames,params.outColSpace,params.inColSpace);
% Write frames as a YUV sequence
[imgRes,imgSize] = yuv.write(frames,name,params);
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment