Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

RGB to YUV conversion using Symbian C++

From Wiki
Jump to: navigation, search

Archived.pngArchived: This article is archived because it is not considered relevant for third-party developers creating commercial solutions today. If you think this article is still relevant, let us know by adding the template {{ReviewForRemovalFromArchive|user=~~~~|write your reason here}}.

The article is believed to be still valid for the original topic scope.

Article Metadata
Tested with
Devices(s): All (S60)
Compatibility
Platform(s): S60 3rd Edition
S60 3rd Edition, Feature Pack 1
S60 3rd Edition, Feature Pack 2
S60 5th Edition
S60 5th Edition
S60 3rd Edition FP2
S60 3rd Edition FP1
S60 3rd Edition (initial release)
Article
Keywords: TUncompressedVideoFormat, EYuvRawData
Created: User:Technical writer 1 (08 Dec 2008)
Last edited: lpvalente (28 Jul 2014)

Description

Starting from S60 3rd Edition, Feature Pack 2, the MDF DevVideoRecord API is available as part of the SDK API Plug-in package. DevVideoRecord allows direct and low-level access to video encoders and preprocessors, making it possible to take content from any source in addition to the camera (for example, bitmap images), pass it to DevVideoRecord, and produce an encoded video stream.

Input to the encoder must conform to a specific colour format; YUV422 or more commonly, YUV420 (planar). YUV420 has 8-bit luminance (Y) value per source pixel, and a reduced number of chrominance (U,V) samples, each covering a 2x2 pixel area. In plane mode, the values of Y, U, and V channels are grouped together in the memory [Y0Y1Y2Y3Y4Y5Y6Y7....U0U1....V0V1], improving the compression rate of the image.

Solution

The following code demonstrates how to convert a frame of source RGB (8 bits per channel) to YUV420p.

 // Definitions that help access each colour component in source bitmap
#define sR ((TInt32)(s[2]))
#define sG ((TInt32)(s[1]))
#define sB ((TInt32)(s[0]))
 
#define KImageWidth 176 // QCIF resolution
#define KImageHeigth 144
 
const TInt KImageNumPixels = KImageWidth * KImageHeigth;
  // Lock source bitmap (CFbsBitmap)
iSourceBitmap->LockHeap(EFalse);
TUint8* s = (TUint8*)iSourceBitmap->DataAddress();
 
TInt i = 0;
TInt ui = KImageNumPixels;
TInt vi = KImageNumPixels + KImageNumPixels/4;
 
// iYuv is an array of TUint8 values, length (KImageNumPixels*3/2)
 
for(TInt j=0; j < KImageHeigth; j++)
for(TInt k=0; k < KImageWidth; k++)
{
// Y value is generated for each pixel
iYuv[i] = (TUint8)( ( 66*sR + 129*sG + 25*sB + 128) >> 8 ) + 16;
 
// U, V values are generated for every other pixel on every other scanline
if(0 == j%2 && 0 == k%2)
{
iYuv[ui++] = (TUint8)( (-38*sR - 74*sG + 112*sB + 128) >> 8 ) + 128;
iYuv[vi++] = (TUint8)( (112*sR - 94*sG - 18*sB + 128) >> 8 ) + 128;
}
i++;
s+=iBytesPerPixel; // Number of bytes representing one pixel in source
// bitmap e.g. if bitmap display mode == EColor16M
// (24bits/pixel), then iBytesPerPixel == 3
}
 
iSourceBitmap->UnlockHeap(EFalse);
// iYuv now contains the source frame converted to YUV420p format

Notes:

The latest S60 devices have multiple DevVideoRecord codecs with varying capabilities: H.263 and/or MPEG-4 (VSP) encoding, hardware-accelerated and software-based codecs, and some encoders also support direct capture from the camera. Encoders and their capabilities as well as supported input formats can be listed and a suitable encoder selected programmatically.

This page was last modified on 28 July 2014, at 17:45.
146 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×