home *** CD-ROM | disk | FTP | other *** search
/ Geek 6 / Geek-006.iso / linux / video / xmovie-1.5.3.tar.gz / xmovie-1.5.3.tar / xmovie-1.5.3 / quicktime / qtpng.c < prev    next >
C/C++ Source or Header  |  2000-11-29  |  3KB  |  109 lines

  1. #include "qtpng.h"
  2.  
  3. static int quicktime_delete_codec_png(quicktime_video_map_t *vtrack)
  4. {
  5.     quicktime_png_codec_t *codec = ((quicktime_codec_t*)vtrack->codec)->priv;
  6.     free(codec);
  7.     return 0;
  8. }
  9.  
  10. void quicktime_set_png(quicktime_t *file, int compression_level)
  11. {
  12.     int i;
  13.     char *compressor;
  14.  
  15.     for(i = 0; i < file->total_vtracks; i++)
  16.     {
  17.         if(quicktime_match_32(quicktime_video_compressor(file, i), QUICKTIME_PNG))
  18.         {
  19.             quicktime_png_codec_t *codec = ((quicktime_codec_t*)file->vtracks[i].codec)->priv;
  20.             codec->compression_level = compression_level;
  21.         }
  22.     }
  23. }
  24.  
  25. static int quicktime_decode_png(quicktime_t *file, unsigned char **row_pointers, int track)
  26. {
  27.     int result = 0;
  28.     long i, bytes;
  29.     quicktime_trak_t *trak = file->vtracks[track].track;
  30.     png_structp png_ptr;
  31.     png_infop info_ptr;
  32.     png_infop end_info = 0;    
  33.  
  34. /*    if(!file->vtracks[track].frames_cached) */
  35. /*    { */
  36.     quicktime_set_video_position(file, file->vtracks[track].current_position, track);
  37.     png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
  38.     info_ptr = png_create_info_struct(png_ptr);
  39.     png_init_io(png_ptr, quicktime_get_fd(file));    
  40.     png_read_info(png_ptr, info_ptr);
  41. /*    } */
  42. /* Forget cached frames */
  43. /*    else */
  44. /*    { */
  45. /*    } */
  46.  
  47. /* read the image */
  48.     png_read_image(png_ptr, row_pointers);
  49.     png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
  50.     return result;
  51. }
  52.  
  53. static int quicktime_encode_png(quicktime_t *file, unsigned char **row_pointers, int track)
  54. {
  55.     long offset = quicktime_position(file);
  56.     int result = 0;
  57.     int i;
  58.     quicktime_trak_t *trak = file->vtracks[track].track;
  59.     quicktime_png_codec_t *codec = ((quicktime_codec_t*)file->vtracks[track].codec)->priv;
  60.     int height = trak->tkhd.track_height;
  61.     int width = trak->tkhd.track_width;
  62.     png_structp png_ptr;
  63.     png_infop info_ptr;
  64.     long bytes;
  65.     int depth = quicktime_video_depth(file, track);
  66.  
  67.     png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
  68.     info_ptr = png_create_info_struct(png_ptr);
  69.     png_init_io(png_ptr, quicktime_get_fd(file));    
  70.     png_set_compression_level(png_ptr, codec->compression_level);
  71.     png_set_IHDR(png_ptr, info_ptr, width, height,
  72.               8, depth == 24 ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGB_ALPHA, 
  73.               PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
  74.     png_write_info(png_ptr, info_ptr);
  75.     png_write_image(png_ptr, row_pointers);
  76.     png_write_end(png_ptr, info_ptr);
  77.     png_destroy_write_struct(&png_ptr, &info_ptr);
  78.  
  79.     bytes = quicktime_position(file) - offset;
  80.     quicktime_update_tables(file,
  81.                         file->vtracks[track].track,
  82.                         offset,
  83.                         file->vtracks[track].current_chunk,
  84.                         file->vtracks[track].current_position,
  85.                         1,
  86.                         bytes);
  87.  
  88.     file->vtracks[track].current_chunk++;
  89.     return result;
  90. }
  91.  
  92.  
  93. void quicktime_init_codec_png(quicktime_video_map_t *vtrack)
  94. {
  95.     quicktime_png_codec_t *codec;
  96.  
  97. /* Init public items */
  98.     ((quicktime_codec_t*)vtrack->codec)->priv = calloc(1, sizeof(quicktime_png_codec_t));
  99.     ((quicktime_codec_t*)vtrack->codec)->delete_vcodec = quicktime_delete_codec_png;
  100.     ((quicktime_codec_t*)vtrack->codec)->decode_video = quicktime_decode_png;
  101.     ((quicktime_codec_t*)vtrack->codec)->encode_video = quicktime_encode_png;
  102.     ((quicktime_codec_t*)vtrack->codec)->decode_audio = 0;
  103.     ((quicktime_codec_t*)vtrack->codec)->encode_audio = 0;
  104.  
  105. /* Init private items */
  106.     codec = ((quicktime_codec_t*)vtrack->codec)->priv;
  107.     codec->compression_level = 9;
  108. }
  109.