diff --git a/read.m b/read.m index a2121ae64c52e8956b45391ee392fffd3ae04c38..6ba48f485cec32d49f883b15e0b98ca99e3b5000 100644 --- a/read.m +++ b/read.m @@ -1,4 +1,4 @@ -function frames = read(imgSize,imgRes,varargin) +function frames = read(varargin) %READ Write yuv file from a cell array of frames % READ(frames,'name',name) read yuv file with corresponding to name filename % READ(frames,'recDir',recDir) read from directory recDir @@ -9,22 +9,51 @@ function frames = read(imgSize,imgRes,varargin) %% Parse input parameters filename = fullfile(pwd,'sequence'); -switch imgSize(3); case 1; subSamp = '400'; case 3; subSamp = '444'; end - p = inputParser; p.StructExpand = true; p.KeepUnmatched = true; -p.addParameter('filename' , filename, @ischar); -p.addParameter('subSamp' , subSamp , @ischar); -p.addParameter('bitDepth' , 8 , @isnumeric); -p.addParameter( 'inColSpace', 'rgb' , @ischar); -p.addParameter('outColSpace', 'ycbcr' , @ischar); +p.addParameter('filename', filename, @ischar); +p.addParameter('addInfo' , true , @islogical); + +p.parse(varargin{:}); + +filename = p.Results.filename; +addInfo = p.Results.addInfo; + +if addInfo + [~,imgSize,imgRes,subSamp,bitDepth] = yuv.name2params(filename); +else + imgSize = [0,0,0]; + imgRes = [0,0]; + bitDepth = 0; + + p.addParameter('imgSize', imgSize, @isnumeric); + p.parse(varargin{:}); + + imgSize = p.Results.imgSize; + + switch imgSize(3) + case 1 + subSamp = '400'; + case 3 + subSamp = '444'; + end + + p.addParameter('imgRes' , imgRes , @isnumeric); + p.addParameter('subSamp' , subSamp , @ischar); + p.addParameter('bitDepth', bitDepth, @isnumeric); + + p.parse(varargin{:}); + + imgRes = p.Results.imgRes; + subSamp = p.Results.subSamp; + bitDepth = p.Results.bitDepth; +end + +p.addParameter( 'inColSpace', 'rgb' , @ischar); +p.addParameter('outColSpace', 'ycbcr', @ischar); p.parse(varargin{:}); -params = p.Results; -filename = params.filename; -subSamp = params.subSamp; -bitDepth = p.Results.bitDepth; -inColSpace = p.Results.inColSpace; +inColSpace = p.Results.inColSpace; outColSpace = p.Results.outColSpace; precision = ['uint',num2str(max(8,2^ceil(log2(bitDepth))))]; @@ -58,9 +87,9 @@ subImgSize = [numel(xgv),numel(ygv)]; UV = griddedInterpolant({xgv,ygv},zeros(subImgSize),'linear','nearest'); %% Read frames iteratively -convname = yuv.params2name(filename,imgSize,subSamp,bitDepth,'.yuv'); +%filename = yuv.params2name(filename,imgSize,imgRes,subSamp,bitDepth); -fileID = fopen(convname,'r'); +fileID = fopen(filename,'r'); imgRes(end+1:2) = 1; imgGrid = zeros(imgRes); @@ -81,17 +110,17 @@ end frames = reshape(frames,imgRes); %% Auxiliary function - % Read a single frame of given dimensions +% Read a single frame of given dimensions function frame = readFrame(imgSize) frame = fread(fileID,flip(imgSize),['*',precision])'; end - % Read a single Y frame +% Read a single Y frame function Y = readY(~) Y = readFrame(imgSize(1:2)); end - %Read Y, U and V frames +%Read Y, U and V frames function YUV = readYUV(~) Y = readFrame(imgSize(1:2)); UV.Values = double(readFrame(subImgSize)); diff --git a/write.m b/write.m index 5d8e683fc116453a0859c499910c01e01dffa64a..db113dbc0f4c6b429c0c4376514e772f9a33e182 100644 --- a/write.m +++ b/write.m @@ -1,4 +1,4 @@ -function [imgSize,imgRes] = write(frames,varargin) +function filename = write(frames,varargin) %WRITE Write yuv file from a cell array of frames % WRITE(frames,'name',name) use name as yuv filename % WRITE(frames,'refDir',refDir) write in directory refDir @@ -20,20 +20,30 @@ p = inputParser; p.StructExpand = true; p.KeepUnmatched = true; p.addParameter('filename' , filename, @ischar); p.addParameter('subSamp' , subSamp , @ischar); p.addParameter('bitDepth' , bitDepth, @isnumeric); + p.addParameter( 'inColSpace', 'rgb' , @ischar); p.addParameter('outColSpace', 'ycbcr' , @ischar); +p.addParameter('addInfo' , true , @islogical); + p.parse(varargin{:}); params = p.Results; filename = params.filename; -subSamp = params.subSamp; +subSamp = params.subSamp; bitDepth = p.Results.bitDepth; -inColSpace = p.Results.inColSpace; + +inColSpace = p.Results.inColSpace; outColSpace = p.Results.outColSpace; +addInfo = p.Results.addInfo; + precision = ['uint',num2str(max(8,2^ceil(log2(bitDepth))))]; +if addInfo + filename = yuv.params2name(filename,imgSize,imgRes,subSamp,bitDepth); +end + %% Incompatibility if imgSize(3)~=1 && imgSize(3)~=3 error('Unexpected number of channels'); @@ -66,15 +76,13 @@ end UV = griddedInterpolant({xgv,ygv},zeros(imgSize(1:2)),'linear','nearest'); %% Write frames iteratively -convname = yuv.params2name(filename,imgSize,subSamp,bitDepth,'.yuv'); - % Check if save folder exists -convdir = fileparts(convname); +convdir = fileparts(filename); if ~exist(convdir,'dir') mkdir(convdir); end -fileID = fopen(convname,'w+'); +fileID = fopen(filename,'w+'); frames = cellfun(@double,frames,'UniformOutput',false); if strcmp(subSamp,'400')