%% Pixel-Streaming Design in MATLAB
% This example shows how to design pixel-stream video processing algorithms using Vision HDL Toolbox™ objects in the MATLAB® environment and generate HDL code from the design.
% This example also tests the design using a small thumbnail image to reduce simulation time. To simulate larger images, such as 1080p video format, use MATLAB Coder™ to accelerate the simulation. See Accelerate a Pixel-Streaming Design Using MATLAB Coder.
%% Test Bench
% In the test bench PixelStreamingDesignHDLTestBench.m, the videoIn object reads each frame from a video source, and the  scaler object reduces this frame from 240p to a thumbnail size for the sake of simulation speed. This thumbnail image is passed to the frm2pix object, which converts the full image frame to a stream of pixels and control structures. The function PixelStreamingDesignHDLDesign.m is then called to process one pixel (and its associated control structure) at a time. After we process the entire pixel-stream and collect the output stream, the pix2frm object converts the output stream to full-frame video. The viewer object displays the output and original images side-by-side.
% The workflow above is implemented in the following lines of PixelStreamingDesignHDLTestBench.m.
%      ...
%      for f = 1:numFrm
%          frmFull = step(videoIn);        % Get a new frame
%          frmIn = step(scaler,frmFull);   % Reduce the frame size
%          [pixInVec,ctrlInVec] = step(frm2pix,frmIn);
%          for p = 1:numPixPerFrm
%              [pixOutVec(p),ctrlOutVec(p)] = PixelStreamingDesignHDLDesign(pixInVec(p),ctrlInVec(p));
%          end
%          frmOut = step(pix2frm,pixOutVec,ctrlOutVec);
%          step(viewer,[frmIn frmOut]);
%      end
%      ...
% Both frm2pix and pix2frm are used to convert between full-frame and pixel-stream domains. The inner for-loop performs pixel-stream processing. The rest of the test bench performs full-frame processing (i.e., videoIn, scaler, and viewer).
% Before the test bench terminates, frame rate is displayed to illustrate the simulation speed.
%% Pixel-Stream Design
% The function defined in PixelStreamingDesignHDLDesign.m accepts a pixel stream and five control signals, and returns a modified pixel stream and control signals. For more information on the streaming pixel protocol used by System objects from the Vision HDL Toolbox, see Streaming Pixel Interface.
% In this example, the function contains the Gamma Corrector System object.
% The focus of this example is the workflow, not the algorithm design itself. Therefore, the design code is quite simple. Once you are familiar with the workflow, it is straightforward to implement advanced video algorithms by taking advantage of the functionality provided by the System objects from Vision HDL Toolbox.
%% Simulate the Design
% Simulate the design with the test bench prior to HDL code generation to make sure there are no runtime errors.

PixelStreamingDesignHDLTestBench;

%
%
% The viewer displays the original video on the left, and the output on the right. One can clearly see that the gamma operation results in a brighter image.
% Enter the following command to create a new HDL Coder™ project,
% coder -hdlcoder -new PixelStreamingDesignProject
% Then, add the file PixelStreamingDesignHDLDesign.m to the project as the MATLAB Function and PixelStreamingDesignHDLTestBench.m as the MATLAB Test Bench.
% Refer to Getting Started with MATLAB to HDL Workflow for a tutorial on creating and populating MATLAB HDL Coder projects.
% Launch the Workflow Advisor. In the Workflow Advisor, right-click the 'Code Generation' step. Choose the option 'Run to selected task' to run all the steps from the beginning through HDL code generation.
% Examine the generated HDL code by clicking the links in the log window.
%
% Copyright 2014 The MathWorks, Inc.