[FFmpeg-devel] [PATCH] encoder for adobe's flash ScreenVideo2

Leon Ou ouliyong at gmail.com
Mon Mar 21 02:15:07 CET 2011


Hi all,



In the mail list, I find a encoder for adobe’s flash ScreenVideo2 written by
Joshua. After read the code below. I make some changes to this code to
decreases  the size of encoded data for the situation of pool bandwidth.In
Joshua code, the low 3 bits of every channel of RGB are discarded.  But in
my code, the low 4 bits of every channel of RGB are discarded. After the
test, discarding the low 4 bits doesn’t lower  the picture quality
significantly.

Below is the test data of this two ways:


A Screen capture with 1440*900, the raw data is 3.7MB.



Reserving high 5 bits +Default Palette+ZLIB..................The encode size
is 680KB



Reserving high 4 bits +Default Palette+ZLIB..................The encode size
is 350KB



After discussion with Joshua, I change one method in his code and add two
new methods to compatible the two ways of handling RGB color.


*1.Change the method:** **pixel_color15. *

*
*

static inline unsigned pixel_color15(const uint8_t * src, int mask)

{

return ((src[0] & mask) >> 3) | ((src[1] & mask) << 2) | ((src[2] & mask) <<
7);

}



Add a parameter ‘mask’ to the  pixel_color15



*2. Add two new methods.*

static int update_palette_index_size(Palette * palette)


{
 for(int i =0; i<32768;i++)
 {
    palette->index[i] = 0x80;
 }



 for (int index = 0; index < 128; index++)
 {

  uint8_t c_r = palette->colors[index]>>16;
  uint8_t c_g = palette->colors[index]>>8 & 0xff;
  uint8_t c_b = palette->colors[index] & 0xff;
  unsigned palette_color_15 = ((c_b & 0xf0) >> 3) | ((c_g & 0xf0) << 2) |
((c_r & 0xf0) << 7);
     unsigned short bgri = (unsigned short)palette_color_15;

     palette->index[bgri] = index;
 }

 return 0;
}



 static int write_pixel_15_7_size(Palette * palette, uint8_t * dest, const
uint8_t * src, int dist)
{
 unsigned short c15_4bits = pixel_color15(src, mask);
 if (palette->index[c15_4bits]!=0x80)
 {
  dest[0] = (uint8_t) palette->index[c15_4bits];
  return 1;
 }
 else
 {
  dest[0] = 0x80 | (uint8_t) (c15_4bits >> 8);
  dest[1] = c15_4bits & 0xff;
  return 2;
 }
}



Whiling focus on screen capture image size, the update_palette_index_size
and write_pixel_15_7_size will be replace the update_palette_index and
write_pixel_15_7 in your code. In the write_pixel_15_7_size, the 'dist'
parameter is used as 'mask'. So, in the flashsv2_encode_frame, the dist
should be set to 0xF0.



Whiling focus on screen capture image quality, the update_palette_index and
write_pixel_15_7 should be chosen and passes the “0xF1” for the ‘mask’
parameter of method  pixel_color15.



For the detail code, Please see the attchment.


Thanks

-Leon
-------------- next part --------------
A non-text attachment was scrubbed...
Name: encode_svc2.cpp
Type: text/x-c++src
Size: 1081 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20110321/2c8c4e8b/attachment-0001.bin>


More information about the ffmpeg-devel mailing list