Difference between revisions of "EE586L/CCSv4 FAQ"
(→eInfoChips Video Daughtercard) |
(→Log on DSK) |
||
(32 intermediate revisions by the same user not shown) | |||
Line 4: | Line 4: | ||
As this is a new and completely different version of CCS the TAs are still learning the software as well. If you don't see your question answered here please email the TAs who will be glad to help and add your question to the pool of knowledge. | As this is a new and completely different version of CCS the TAs are still learning the software as well. If you don't see your question answered here please email the TAs who will be glad to help and add your question to the pool of knowledge. | ||
+ | |||
+ | == Install ccsv4 == | ||
+ | |||
+ | You can download CCSv4 here: | ||
+ | http://processors.wiki.ti.com/index.php/Download_CCS | ||
+ | or if you prefer CCSv5 is already available, and is Linux compatible. However, the TAs will not be responsible for supporting CCSv5. You can download CCSv5 here: | ||
+ | http://processors.wiki.ti.com/index.php/Category:Code_Composer_Studio_v5 | ||
+ | |||
+ | You can refer to the instruction of installing CCSv4 here: http://biron.usc.edu/~sungwonl/EE586/CCSv4_Installation_Instruction.pdf | ||
== Importing Legacy CCS v3.x Projects == | == Importing Legacy CCS v3.x Projects == | ||
Line 68: | Line 77: | ||
* In CCS select '''Help->Licensing Options...''' | * In CCS select '''Help->Licensing Options...''' | ||
** Then mark the box '''Activate a License''' | ** Then mark the box '''Activate a License''' | ||
− | ** In Step 2 - Install a License File, select '''Specify a License Server''' and use the address: sipi-dsp-11.usc.edu and port: 57566 (Spring | + | ** In Step 2 - Install a License File, select '''Specify a License Server''' and use the address: sipi-dsp-11.usc.edu and port: 57566 (Spring 2013 only) |
== Using the Debugger == | == Using the Debugger == | ||
== GEL Files/Sliders == | == GEL Files/Sliders == | ||
− | In CCSv4 the GEL Files/Sliders operate differently than in previous iterations. | + | *For more details, check this pointer: http://processors.wiki.ti.com/index.php/FAQ_-_CCSv4#GEL |
+ | *In CCSv4 the GEL Files/Sliders operate differently than in previous iterations. | ||
* Load GEL | * Load GEL | ||
** While debugging select '''Tools->GEL File''' to load a GEL file for the current debugging session | ** While debugging select '''Tools->GEL File''' to load a GEL file for the current debugging session | ||
Line 89: | Line 99: | ||
Other potential uses of breakpoints include: | Other potential uses of breakpoints include: | ||
* '''Update View''' - can be used to refresh a Graph or Image automatically | * '''Update View''' - can be used to refresh a Graph or Image automatically | ||
+ | |||
+ | == SVN Instruction == | ||
+ | This only covers SVN using Code Composer. However, you are free to use other clients on your laptops. | ||
+ | By default, CCSV is not delivered with SVN plugin thus you need to install it before use: refer to http://biron.usc.edu/~sungwonl/EE586/SVN_Installation_2012.pdf | ||
+ | To access SVN server, you first need to get an ID/passwd from TAs. Each group will be assigned a group folder (Group_xx), user name (Group_xx) and you select a password. | ||
+ | You can refer to details: http://biron.usc.edu/~sungwonl/EE586/SVNinstruction.pdf | ||
+ | |||
+ | == SYS/BIOS (BIOS 6.34) == | ||
+ | User's Guide for SYS/BIOS v6.34 : http://www.ti.com/lit/ug/spruex3l/spruex3l.pdf | ||
+ | |||
+ | == Log on DSK == | ||
+ | * You can use printf-like functions to leave logs from DSK board. | ||
+ | * To exploit the feature, you need to use SYS/BIOS (BIOS 6.xx) and enable 'Realtime analysis' in the SYS/BIOS setup. | ||
+ | * Please read the instruction: http://biron.usc.edu/~sungwonl/EE586/BIOS_Bottleneck_Analysis.pdf | ||
+ | * For more details about the log functions, refer to User's guide above and to http://rtsc.eclipse.org/cdoc-tip/xdc/runtime/Log.html#warning | ||
+ | |||
+ | #include <xdc/cfg/global.h> | ||
+ | #include <xdc/runtime/Log.h> | ||
+ | int xx = 1, yy = 100; | ||
+ | // refer to the above link to see more functions | ||
+ | Log_info0("Main Started"); // no argument | ||
+ | Log_info1("xx = %d", xx); // 1 argument | ||
+ | Log_info2("xx = %d, yy=%d", xx, yy); // 2 arguments | ||
+ | |||
+ | == Measure CPU cycles in ccsv4 == | ||
+ | * Refer to a document from TI: http://processors.wiki.ti.com/index.php/Profile_clock_in_CCS | ||
+ | * As discussed in the document, we need to setup breakpoints at the beginning and the end of the block that you want to profile. | ||
+ | * If you choose automatic reset option in Target->Clock->Setup of debug mode, the clock is reset every time it breaks. | ||
+ | * If you want to convert the cycles to time, divide the number of cycles you measured with CPU clock speed of the board you are using. | ||
+ | ** For example, for Davinci board with 600 MHz CPU, time (seconds) = (# of clock cycles) / ( 6 * 10^8). | ||
+ | ** FYI, DSK6416 is running with 1 GHz and DSK6713 with 225 MHz. | ||
+ | |||
+ | == Optimization == | ||
+ | * Measure running time in CPU cycles | ||
+ | ** Use a function TIMER_getCount() like in example below. | ||
+ | *** The reason why you multiply by 8 is because the maximum resolution of the timer in '''C6416''' is 8 CPU cycles in this example. | ||
+ | *** If you use '''C6713''', it should be 4. For details, refer to [http://focus.ti.com/lit/an/spra887/spra887.pdf] for C6416 and [http://focus.ti.com/lit/an/spra947a/spra947a.pdf] for C6713. | ||
+ | |||
+ | include <csl_timer.h> | ||
+ | // Configure timer | ||
+ | hTimer = TIMER_open(TIMER_DEVANY,0); | ||
+ | TIMER_configArgs(hTimer, 0x000002C0, 0xFFFFFFFF, 0x00000000); | ||
+ | start = TIMER_getCount(hTimer); // called twice to avoid L1D miss. | ||
+ | start = TIMER_getCount(hTimer); | ||
+ | stop = TIMER_getCount(hTimer); | ||
+ | overhead = stop - start; | ||
+ | start = TIMER_getCount(hTimer); // begin "profile area" | ||
+ | '''foo(); // Any function / routine you want to measure ''' | ||
+ | stop = TIMER_getCount(hTimer); // end "profile area" | ||
+ | t = (stop-start-overhead) * '''8'''; | ||
+ | printf("# cycles to run foo(): %d\n", t); | ||
+ | |||
+ | * We strongly recommend to use EDMA for the transmission of data from video daughter card to DSK board | ||
+ | ** Experiment result (loopback examples) : Comparison in terms of frames per seconds | ||
+ | *** DSK6713 / VM3224K2(new video daughtercard) / '''cam2lcd2 ''' : 7.5 frames / sec | ||
+ | *** DSK6713 / VM3224K2(new video daughtercard) / '''cam2lcd3_EDMA''' : 10 frames / sec | ||
+ | *** DSK6713 / VM3224K2(new video daughtercard) / '''cam2lcd3_QDMA''' : 10 frames / sec | ||
+ | ** We havn't tested with DSK 6416 and older video daughter card but we expect similar performance gain of EDMA. | ||
+ | |||
+ | |||
+ | == Examples == | ||
+ | The following codes are provided as one of examples used as assignments for EE586L at University of Southern California. They are skeleton codes so that they don't fully function without appropriate addition to it. We make no representations or warranties of any kind concerning the safety, suitability, lack of viruses, inaccuracies, typographical errors, or other harmful components of these examples. There are inherent dangers in the use of any software, and you are solely responsible for determining whether these codes are compatible with your equipment and other software installed on your equipment. You are also solely responsible for the protection of your equipment and backup of your data, and we will not be liable for any damages you may suffer in connection with using, modifying, or distributing these examples. | ||
+ | |||
+ | * DSK 6713 | ||
+ | ** Ring Modulation [http://biron.usc.edu/~sungwonl/EE586/RingModLab_New.zip] | ||
+ | ** Audio Noise Template [http://biron.usc.edu/~sungwonl/EE586/Audio_Noise_Template.zip] | ||
== DSP Lab Equipment == | == DSP Lab Equipment == | ||
Line 94: | Line 170: | ||
* DSP Boards | * DSP Boards | ||
− | ** | + | ** 10 6713 |
− | ** | + | ** 8 6416 / 6416T |
− | ** | + | ** 8 6437 Davinci |
* Daughter Cards | * Daughter Cards | ||
− | ** | + | ** 5 - ND Tech Video Daughtercard |
*** Analog Video Input (composite)/ LCD Display Output | *** Analog Video Input (composite)/ LCD Display Output | ||
*** Works with 6713 and 6416 | *** Works with 6713 and 6416 | ||
*** [http://www.nd-tech.com/web/main.html?menu=product&sub=sub9 User Manual] | *** [http://www.nd-tech.com/web/main.html?menu=product&sub=sub9 User Manual] | ||
− | ** | + | ** 2 - Old Video Daughtercard |
*** Composite and S-Video Input/ Composite and S-Video Output | *** Composite and S-Video Input/ Composite and S-Video Output | ||
*** Works with 6416 only | *** Works with 6416 only | ||
Line 128: | Line 204: | ||
** 5 Older Video Cameras | ** 5 Older Video Cameras | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== eInfoChips Video Daughtercard == | == eInfoChips Video Daughtercard == | ||
Line 172: | Line 229: | ||
** For video with Rx by Ry resolution, each frame is represented by Rx * Ry /2 pixels because it's interlaced. | ** For video with Rx by Ry resolution, each frame is represented by Rx * Ry /2 pixels because it's interlaced. | ||
** For color representation, Y component is expressed by 16 bits, Cr and Cb by 8 bits each. But, in the implementation of eInfoChips Video Daughtercard, each component of neighboring 2 pixels is represented by one variable which has twice larger bits in the constecated form. For example, Y components for 2 adjacent pixels are implemented by one 32bit (unsigned int) variable. | ** For color representation, Y component is expressed by 16 bits, Cr and Cb by 8 bits each. But, in the implementation of eInfoChips Video Daughtercard, each component of neighboring 2 pixels is represented by one variable which has twice larger bits in the constecated form. For example, Y components for 2 adjacent pixels are implemented by one 32bit (unsigned int) variable. | ||
− | ** Example : Capture video then play it on external display | + | ** Example (SWLoopBack) : Capture video then play it on external display |
/* Example of SWLoopBack */ | /* Example of SWLoopBack */ |
Latest revision as of 15:56, 15 April 2013
Contents
- 1 Code Composer Studio v4 Frequently Asked Questions
- 2 Install ccsv4
- 3 Importing Legacy CCS v3.x Projects
- 4 Project Properties
- 5 Common Compling/Linking Errors
- 6 License Server
- 7 Using the Debugger
- 8 GEL Files/Sliders
- 9 Breakpoint Properties
- 10 SVN Instruction
- 11 SYS/BIOS (BIOS 6.34)
- 12 Log on DSK
- 13 Measure CPU cycles in ccsv4
- 14 Optimization
- 15 Examples
- 16 DSP Lab Equipment
- 17 eInfoChips Video Daughtercard
Code Composer Studio v4 Frequently Asked Questions
Below are solutions to some of the commonly encountered problems with CCSv4.
As this is a new and completely different version of CCS the TAs are still learning the software as well. If you don't see your question answered here please email the TAs who will be glad to help and add your question to the pool of knowledge.
Install ccsv4
You can download CCSv4 here: http://processors.wiki.ti.com/index.php/Download_CCS or if you prefer CCSv5 is already available, and is Linux compatible. However, the TAs will not be responsible for supporting CCSv5. You can download CCSv5 here: http://processors.wiki.ti.com/index.php/Category:Code_Composer_Studio_v5
You can refer to the instruction of installing CCSv4 here: http://biron.usc.edu/~sungwonl/EE586/CCSv4_Installation_Instruction.pdf
Importing Legacy CCS v3.x Projects
The textbook provides many example projects showing the functionality of the board. However, these examples were written for a previous iteration of Code Composer Studio.
Follow these steps to import legacy projects and convert them to the project format of CCSv4:
- Launch CCS and select a workspace.
- Workspaces are used to store your personal projects, so having an individual workspace prevents other groups from modifying your projects.
- Create a workspace other than the default, such as, EE586_Group01 or your name.
- Select Project -> Import Legacy CCSv3.3 Project
- In the Dialog box that appears, browse for the project file that you would like to import and select the Copy projects into workspace radio button. Click Next
- At the next screen select the default Code Generation Tools (already selected). Click Next.
- On the Enable DSP/BIOS Tools screen select Automatically determine DSP/BIOSv5.x support enablement.
- On the Set Advance Options screen do not check the box for using a common root.
Project Properties
Below are the common project property settings used in the book examples. If you are having compiling/linking issues check these settings.
Access the project properties by selecting Project->Properties. All of the following settings are located under the C/C++ Build tab located on left side of the Properties dialog box, and under the Configuration Settings->Tool Settings tab in the center of the dialog box.
- C6000 Compiler
- Basic Options:
- Target Processor Version - should be 6700 or 6400 for the C6713 and C6416 boards, respectively
- Predefined Symbols:
- Pre-define NAME - either "CHIP_6713" or "CHIP_6416", also some projects use "DEBUG" or "_DEBUG"
- Include Options:
- Add dir to #include search path - the include directories of all the libraries used in the project must be included here
- Note: you must locate these folders specifically on your PC as the locations might vary
- ..\csl\include
- ..\dsk6416\include or ...\dsk6713\include
- ..\C6400\imglib\include if using the IMGLIB
- Basic Options:
- C6000 Linker
- File Search Path:
- Add <dir> to library search path - the lib directories of all the libraries used in the project
- Note: you must locate these folders specifically on your PC as the locations might vary
- ..\csl\lib
- ..\dsk6416\lib or ...\dsk6713\lib
- File Search Path:
Common Compling/Linking Errors
Note: these errors are due to incorrect project property settings. If you are not putting your semicolons in, you won't find your answers here!
- Where is the rts6xxx.lib file??
- The rts library files can be found in the folder:
- ..\Texas Instruments\C6000 Code Generation Tools 7.0.4\lib
- ERROR: Compiler error, 'Can't find file ...'
- Solution:
- When importing book examples some of the files included in the project can not be found.
- Delete the file from the project, then select Project->Link Files to Active Project and locate the missing files
- Common examples
- csl6713.lib, dsk6713bsl.lib - located in the ..\csl\lib and ...\dsk6713\lib directories, respectively
- C6713dskinit.h, C6713dskint.c - located in the Support folder supplied with the book examples
- ERROR: Linking error which mentions FAR memory access
- Solution:
- Project Properties -> C\C++ Build -> C6000 Compiler -> Runtime Model Options
- Constant access model - Set to Far
- Data access model - Set to Far
- Project Properties -> C\C++ Build -> C6000 Compiler -> Runtime Model Options
License Server
For Code Composer to function properly you must be using a licensed version. In the lab we use a license server to handle the licensing of our PCs. If a PC you are working with becomes unlicensed do the following to re-activate the connection to the license server.
- In CCS select Help->Licensing Options...
- Then mark the box Activate a License
- In Step 2 - Install a License File, select Specify a License Server and use the address: sipi-dsp-11.usc.edu and port: 57566 (Spring 2013 only)
Using the Debugger
GEL Files/Sliders
- For more details, check this pointer: http://processors.wiki.ti.com/index.php/FAQ_-_CCSv4#GEL
- In CCSv4 the GEL Files/Sliders operate differently than in previous iterations.
- Load GEL
- While debugging select Tools->GEL File to load a GEL file for the current debugging session
- Select Scripts->'GEL NAME' to access the GEL you loaded. Typically this will load the Slider.
- Using GEL Slider
- Unlike CCSv3.x modifications to variables due to the GEL Slider only occur when the simulation is halted in CCSv4
- To update variables without having to halt the simulation:
- Set a breakpoint at the line in your code where the modifiable variable is accessed.
- Right click the breakpoint and select Breakpoint Properties
- In the breakpoint properties dialog, under Debugger Response->Action select Refresh All Windows
Breakpoint Properties
Above we used the breakpoint properties to update variables using the GEL sliders.
Other potential uses of breakpoints include:
- Update View - can be used to refresh a Graph or Image automatically
SVN Instruction
This only covers SVN using Code Composer. However, you are free to use other clients on your laptops. By default, CCSV is not delivered with SVN plugin thus you need to install it before use: refer to http://biron.usc.edu/~sungwonl/EE586/SVN_Installation_2012.pdf To access SVN server, you first need to get an ID/passwd from TAs. Each group will be assigned a group folder (Group_xx), user name (Group_xx) and you select a password. You can refer to details: http://biron.usc.edu/~sungwonl/EE586/SVNinstruction.pdf
SYS/BIOS (BIOS 6.34)
User's Guide for SYS/BIOS v6.34 : http://www.ti.com/lit/ug/spruex3l/spruex3l.pdf
Log on DSK
- You can use printf-like functions to leave logs from DSK board.
- To exploit the feature, you need to use SYS/BIOS (BIOS 6.xx) and enable 'Realtime analysis' in the SYS/BIOS setup.
- Please read the instruction: http://biron.usc.edu/~sungwonl/EE586/BIOS_Bottleneck_Analysis.pdf
- For more details about the log functions, refer to User's guide above and to http://rtsc.eclipse.org/cdoc-tip/xdc/runtime/Log.html#warning
#include <xdc/cfg/global.h> #include <xdc/runtime/Log.h> int xx = 1, yy = 100; // refer to the above link to see more functions Log_info0("Main Started"); // no argument Log_info1("xx = %d", xx); // 1 argument Log_info2("xx = %d, yy=%d", xx, yy); // 2 arguments
Measure CPU cycles in ccsv4
- Refer to a document from TI: http://processors.wiki.ti.com/index.php/Profile_clock_in_CCS
- As discussed in the document, we need to setup breakpoints at the beginning and the end of the block that you want to profile.
- If you choose automatic reset option in Target->Clock->Setup of debug mode, the clock is reset every time it breaks.
- If you want to convert the cycles to time, divide the number of cycles you measured with CPU clock speed of the board you are using.
- For example, for Davinci board with 600 MHz CPU, time (seconds) = (# of clock cycles) / ( 6 * 10^8).
- FYI, DSK6416 is running with 1 GHz and DSK6713 with 225 MHz.
Optimization
- Measure running time in CPU cycles
include <csl_timer.h> // Configure timer hTimer = TIMER_open(TIMER_DEVANY,0); TIMER_configArgs(hTimer, 0x000002C0, 0xFFFFFFFF, 0x00000000); start = TIMER_getCount(hTimer); // called twice to avoid L1D miss. start = TIMER_getCount(hTimer); stop = TIMER_getCount(hTimer); overhead = stop - start; start = TIMER_getCount(hTimer); // begin "profile area" foo(); // Any function / routine you want to measure stop = TIMER_getCount(hTimer); // end "profile area" t = (stop-start-overhead) * 8; printf("# cycles to run foo(): %d\n", t);
- We strongly recommend to use EDMA for the transmission of data from video daughter card to DSK board
- Experiment result (loopback examples) : Comparison in terms of frames per seconds
- DSK6713 / VM3224K2(new video daughtercard) / cam2lcd2 : 7.5 frames / sec
- DSK6713 / VM3224K2(new video daughtercard) / cam2lcd3_EDMA : 10 frames / sec
- DSK6713 / VM3224K2(new video daughtercard) / cam2lcd3_QDMA : 10 frames / sec
- We havn't tested with DSK 6416 and older video daughter card but we expect similar performance gain of EDMA.
- Experiment result (loopback examples) : Comparison in terms of frames per seconds
Examples
The following codes are provided as one of examples used as assignments for EE586L at University of Southern California. They are skeleton codes so that they don't fully function without appropriate addition to it. We make no representations or warranties of any kind concerning the safety, suitability, lack of viruses, inaccuracies, typographical errors, or other harmful components of these examples. There are inherent dangers in the use of any software, and you are solely responsible for determining whether these codes are compatible with your equipment and other software installed on your equipment. You are also solely responsible for the protection of your equipment and backup of your data, and we will not be liable for any damages you may suffer in connection with using, modifying, or distributing these examples.
DSP Lab Equipment
List of the equipment we currently have in the lab.
- DSP Boards
- 10 6713
- 8 6416 / 6416T
- 8 6437 Davinci
- Daughter Cards
- 5 - ND Tech Video Daughtercard
- Analog Video Input (composite)/ LCD Display Output
- Works with 6713 and 6416
- User Manual
- 2 - Old Video Daughtercard
- Composite and S-Video Input/ Composite and S-Video Output
- Works with 6416 only
- Does not work with audio
- 4 - eDSP Multi Channel Audio card
- 4 Channel line/mic input - 4 Channel output
- 6713 and 6416T Compatible
- Product Website
- 5 - ND Tech Video Daughtercard
- Audio Equipment
- 4 Behringer ECM8000 Measurement Microphone
- Omnidirectional measurement microphones
- Flat frequency response, good for beamforming, etc.
- 4 dbx RTA-M Measurement Microphone
- Similar to above, omnidirectional measurement microphones
- 4 Shure SM48 Vocal Microphone
- Good for recording voice for speaker recognition, etc.
- 3 Microphone Preamplifiers
- High quality preamplifiers, get strong signal into board
- 4 Behringer ECM8000 Measurement Microphone
- Video Equipment
- 4 Toshiba Teli CS5260BD Video Cameras
- 1 JAI S3200 Video camera w/ high quality zoom lens
- 5 Older Video Cameras
eInfoChips Video Daughtercard
- If you have a problem with horizontal banding when using the eInfoChips video daughtercard (the one without the LCD) you have to modify the values passed to the configure the EMIF interface function. The values (the 0x0? number) below are the correct values, and the values in the sample code are incorrect. The correct values should match the value given in the comment.
/* Configure the EMIF */ //set read/write setup, strob and hold to 6, 4 and 1 EMIFA_RSET(CECTL2, EMIFA_CECTL_RMK( EMIFA_CECTL_WRSETUP_OF(0x06), // Write Setup width: 6 EMIFA_CECTL_WRSTRB_OF(0x04), // Write Strobe width: 4 EMIFA_CECTL_WRHLD_OF(0x01), // Write Hold width: 1 EMIFA_CECTL_RDSETUP_OF(0x06), // Read Setup width: 6 EMIFA_CECTL_TA_OF(0x03), // Turn-around Time: 3 (default) EMIFA_CECTL_RDSTRB_OF(0x04), // Read Strobe width: 4 EMIFA_CECTL_MTYPE_ASYNC32, // Memory Type: Async 32 bit wide EMIFA_CECTL_WRHLDMSB_OF(0x00),// Write Hold MSB EMIFA_CECTL_RDHLD_OF(0x01) // Read Hold width: 1 ));
- If it does not work even after you change EMIF interface function above, then change Runtime Model Options in properties of your project. Go to C/C++ Build -> C6000 Compiler -> Runtime Model Options.
- Set Const access model and Data access model as far
- YCrCb / Frame structure
- For video with Rx by Ry resolution, each frame is represented by Rx * Ry /2 pixels because it's interlaced.
- For color representation, Y component is expressed by 16 bits, Cr and Cb by 8 bits each. But, in the implementation of eInfoChips Video Daughtercard, each component of neighboring 2 pixels is represented by one variable which has twice larger bits in the constecated form. For example, Y components for 2 adjacent pixels are implemented by one 32bit (unsigned int) variable.
- Example (SWLoopBack) : Capture video then play it on external display
/* Example of SWLoopBack */ // Define pointers to YCrCb's of encoder and decoder unsigned int *pDstY = NULL, *pSrcY = NULL; unsigned short *pDstCb = NULL, *pSrcCb = NULL; unsigned short *pDstCr = NULL, *pSrcCr = NULL; // in the main() while(1) { // Get the pointer to the Frame Captured pDecFrame = vDecGetFrame(); // Get pointer to Y components pDstY = (unsigned int*)(pEncFrame->y); pSrcY = (unsigned int*)(pDecFrame->y); // Get pointer to Cb components pDstCb = (unsigned short*)(pEncFrame->cb); pSrcCb = (unsigned short*)(pDecFrame->cb); // Get pointer to Cr components pDstCr = (unsigned short*)(pEncFrame->cr); pSrcCr = (unsigned short*)(pDecFrame->cr); // Divide by 4 to scan all the pixels in a frame // Why 4 ? // because frames are interlaced and one data point represents 2 pixels of the frame frameWords = (352*288)/4; // Scan all the pixels in a frame for ( i=0; i<frameWords; i++) { // Copy values from decoder to encoder *pDstY = *pSrcY; *pDstCb = *pSrcCb; *pDstCr = *pSrcCr; // Increase pointers by one pDstY++; pSrcY++; pDstCb++; pSrcCb++; pDstCr++; pSrcCr++; } // Send a Frame to Encoder pEncFrame = vEncSendFrame( pEncFrame); }