00001 #include <stdio.h>
00002 #include "rtjpeg.h"
00003 #include "quicktime.h"
00004
00005
00006 int quicktime_init_codec_rtjpeg(quicktime_video_map_t *vtrack, int jpeg_type)
00007 {
00008 quicktime_rtjpeg_codec_t *codec = &(vtrack->codecs.rtjpeg_codec);
00009
00010 codec->quality = 100;
00011 codec->output_buffer = 0;
00012 codec->buffer_size = codec->image_size = 0;
00013 RTjpeg_init_compress(&(codec->compress_struct), vtrack->track->tkhd.track_width, vtrack->track->tkhd.track_height, (int)((float)codec->quality / 100 * 255));
00014 RTjpeg_init_decompress(&(codec->decompress_struct), vtrack->track->tkhd.track_width, vtrack->track->tkhd.track_height);
00015 codec->yuv_frame = malloc(vtrack->track->tkhd.track_width * vtrack->track->tkhd.track_height * 3);
00016 }
00017
00018 int quicktime_delete_codec_rtjpeg(quicktime_video_map_t *vtrack)
00019 {
00020 quicktime_rtjpeg_codec_t *codec = &(vtrack->codecs.rtjpeg_codec);
00021 if(codec->output_buffer)
00022 free(codec->output_buffer);
00023 if(codec->yuv_frame)
00024 free(codec->yuv_frame);
00025 codec->output_buffer = 0;
00026 codec->yuv_frame = 0;
00027 }
00028
00029 int quicktime_decode_rtjpeg(quicktime_t *file, unsigned char **row_pointers, int track)
00030 {
00031 int result = 0;
00032 register int i;
00033 long size;
00034 quicktime_trak_t *trak = file->vtracks[track].track;
00035 quicktime_video_map_t *vtrack = &(file->vtracks[track]);
00036 quicktime_rtjpeg_codec_t *codec = &(vtrack->codecs.rtjpeg_codec);
00037
00038
00039 quicktime_set_video_position(file, vtrack->current_position, track);
00040 size = quicktime_frame_size(file, vtrack->current_position, track);
00041 if(size > codec->buffer_size && codec->output_buffer)
00042 {
00043 free(codec->output_buffer);
00044 codec->output_buffer = 0;
00045 }
00046 if(!codec->output_buffer)
00047 {
00048 codec->output_buffer = malloc(size);
00049 codec->buffer_size = size;
00050 }
00051 result = !quicktime_read_data(file, codec->output_buffer, size);
00052
00053 if(!result)
00054 {
00055
00056 RTjpeg_init_Q(&(codec->decompress_struct), codec->output_buffer[0]);
00057 RTjpeg_decompressYUV420(&(codec->decompress_struct), &(codec->output_buffer[8]), codec->yuv_frame);
00058 RTjpeg_yuv420rgb(&(codec->decompress_struct), codec->yuv_frame, row_pointers[0], 0);
00059 }
00060
00061 return result;
00062 }
00063
00064
00065 int quicktime_encode_jpeg(quicktime_t *file, unsigned char **row_pointers, int track)
00066 {
00067 long offset = quicktime_position(file);
00068 int result = 0;
00069 register int i;
00070 quicktime_trak_t *trak = file->vtracks[track].track;
00071 quicktime_video_map_t *vtrack = &(file->vtracks[track]);
00072 quicktime_jpeg_codec_t *codec = &(vtrack->codecs.jpeg_codec);
00073
00074
00075
00076 bytes = quicktime_position(file) - offset;
00077 quicktime_update_tables(file,
00078 vtrack->track,
00079 offset,
00080 vtrack->current_chunk,
00081 vtrack->current_position,
00082 1,
00083 bytes);
00084
00085 vtrack->current_chunk++;
00086 return result;
00087 }