raw.c
上传用户:luping1608
上传日期:2007-01-06
资源大小:38k
文件大小:2k
源码类别:

多媒体

开发平台:

Unix_Linux

  1. #include "quicktime.h"
  2. int quicktime_init_codec_raw(quicktime_video_map_t *vtrack)
  3. {
  4. }
  5. int quicktime_delete_codec_raw(quicktime_video_map_t *vtrack)
  6. {
  7. }
  8. int quicktime_decode_raw(quicktime_t *file, unsigned char **row_pointers, int track)
  9. {
  10. int i, j, height, width, consecutive_rows;
  11. int result = 0;
  12. quicktime_trak_t *trak = file->vtracks[track].track;
  13. height = trak->tkhd.track_height;
  14. width = trak->tkhd.track_width;
  15. if(!file->vtracks[track].frames_cached)
  16. {
  17. // read a frame from disk
  18. quicktime_set_video_position(file, file->vtracks[track].current_position, track);
  19. if(quicktime_raw_rows_consecutive(row_pointers, width, height))
  20. {
  21. long bytes = quicktime_frame_size(file, file->vtracks[track].current_position, track);
  22. result = quicktime_read_data(file, row_pointers[0], bytes);
  23. if(result) result = 0; else result = 1;
  24. }
  25. else
  26. for(i = 0; i < height && !result; i++)
  27. {
  28. result = quicktime_read_data(file, row_pointers[i], width * 3);
  29. if(result) result = 0; else result = 1;
  30. }
  31. }
  32. else
  33. {
  34. // copy a frame from cache
  35. unsigned char *buffer = file->vtracks[track].frame_cache[file->vtracks[track].current_position];
  36. for(i = 0; i < height && !result; i++)
  37. {
  38. for(j = 0; j < width * 3; j++)
  39. {
  40. row_pointers[i][j] = *buffer++;
  41. }
  42. }
  43. }
  44. return result;
  45. }
  46. int quicktime_encode_raw(quicktime_t *file, unsigned char **row_pointers, int track)
  47. {
  48. long offset = quicktime_position(file);
  49. int result = 0;
  50. int i;
  51. quicktime_trak_t *trak = file->vtracks[track].track;
  52. int height = trak->tkhd.track_height;
  53. int width = trak->tkhd.track_width;
  54. long bytes = height * width * 3;
  55. if(quicktime_raw_rows_consecutive(row_pointers, width, height))
  56. {
  57. result = quicktime_write_data(file, row_pointers[0], bytes);
  58. if(result) result = 0; else result = 1;
  59. }
  60. else
  61. for(i = 0; i < height && !result; i++)
  62. {
  63. result = quicktime_write_data(file, row_pointers[i], width * 3);
  64. if(result) result = 0; else result = 1;
  65. }
  66. quicktime_update_tables(file->vtracks[track].track,
  67. offset,
  68. file->vtracks[track].current_chunk,
  69. file->vtracks[track].current_position,
  70. 1,
  71. bytes);
  72. file->vtracks[track].current_chunk++;
  73. return result;
  74. }
  75. int quicktime_raw_rows_consecutive(unsigned char **row_pointers, int w, int h)
  76. {
  77. int i, result;
  78. // see if row_pointers are consecutive
  79. for(i = 1, result = 1; i < h; i++)
  80. {
  81. if(row_pointers[i] - row_pointers[i - 1] != w * 3) result = 0;
  82. }
  83. return result;
  84. }