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 / dv.c < prev    next >
C/C++ Source or Header  |  2000-11-29  |  3KB  |  90 lines

  1. #include "colormodels.h"
  2. #include "dv.h"
  3. #include "quicktime.h"
  4.  
  5. static int quicktime_delete_codec_dv(quicktime_video_map_t *vtrack)
  6. {
  7.     quicktime_dv_codec_t *codec = ((quicktime_codec_t*)vtrack->codec)->priv;
  8.  
  9.     if(codec->dv) dv_delete(codec->dv);
  10.     free(codec->temp_frame);
  11.     free(codec->data);
  12.     free(codec);
  13.     return 0;
  14. }
  15.  
  16. static int quicktime_decode_dv(quicktime_t *file, unsigned char **row_pointers, int track)
  17. {
  18.     long bytes;
  19.     quicktime_video_map_t *vtrack = &(file->vtracks[track]);
  20.     quicktime_dv_codec_t *codec = ((quicktime_codec_t*)vtrack->codec)->priv;
  21.     int width = vtrack->track->tkhd.track_width;
  22.     int height = vtrack->track->tkhd.track_height;
  23.     int result = 0;
  24.  
  25.     quicktime_set_video_position(file, vtrack->current_position, track);
  26.     bytes = quicktime_frame_size(file, vtrack->current_position, track);
  27.     result = !quicktime_read_data(file, codec->data, bytes);
  28.  
  29.     if(codec->dv)
  30.     {
  31.         if(width == 720 && height == 480)
  32.         {
  33.             dv_read_video(codec->dv, row_pointers, codec->data, bytes, file->color_model);
  34.         }
  35.         else
  36.         {
  37.             register int x, y;
  38.             dv_read_video(codec->dv, codec->temp_rows, codec->data, bytes, file->color_model);
  39.  
  40.             for(y = 0; y < height; y++)
  41.             {
  42.                 for(x = 0; x < width * 3; x++)
  43.                 {
  44.                     row_pointers[y][x] = codec->temp_rows[y][x];
  45.                 }
  46.             }
  47.         }
  48.     }
  49.  
  50.     return result;
  51. }
  52.  
  53. static int quicktime_encode_dv(quicktime_t *file, unsigned char **row_pointers, int track)
  54. {
  55.     fprintf(stderr, "quicktime_encode_dv: DV encoder not available\n");
  56.     return 1;
  57. }
  58.  
  59. // Logic: DV contains a mixture of 420 and 411 so can only output 444 or 422
  60.  
  61. static int quicktime_reads_colormodel_dv(quicktime_t *file, 
  62.         int colormodel, 
  63.         int track)
  64. {
  65.     return (colormodel == BC_RGB888 ||
  66.         colormodel == BC_YUV888);
  67. }
  68.  
  69. void quicktime_init_codec_dv(quicktime_video_map_t *vtrack)
  70. {
  71.     quicktime_dv_codec_t *codec;
  72.     int i;
  73.  
  74. /* Init public items */
  75.     ((quicktime_codec_t*)vtrack->codec)->priv = calloc(1, sizeof(quicktime_dv_codec_t));
  76.     ((quicktime_codec_t*)vtrack->codec)->delete_vcodec = quicktime_delete_codec_dv;
  77.     ((quicktime_codec_t*)vtrack->codec)->decode_video = quicktime_decode_dv;
  78.     ((quicktime_codec_t*)vtrack->codec)->encode_video = quicktime_encode_dv;
  79.     ((quicktime_codec_t*)vtrack->codec)->decode_audio = 0;
  80.     ((quicktime_codec_t*)vtrack->codec)->encode_audio = 0;
  81.     ((quicktime_codec_t*)vtrack->codec)->reads_colormodel = quicktime_reads_colormodel_dv;
  82.  
  83. /* Init private items */
  84.     codec = ((quicktime_codec_t*)vtrack->codec)->priv;
  85.     codec->dv = dv_new();
  86.     codec->temp_frame = calloc(1, 720 * 576 * 3);
  87.     codec->data = calloc(1, 140000);
  88.     for(i = 0; i < 576; i++) codec->temp_rows[i] = codec->temp_frame + 720 * 3 * i;
  89. }
  90.