00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <stdio.h>
00031 #include <stdlib.h>
00032 #include "colormodels.h"
00033 #include "config.h"
00034 #include "global.h"
00035
00036
00037 static void read_quicktime(frame, number)
00038 unsigned char *frame[];
00039 long number;
00040 {
00041 int i, j;
00042 int r, g, b;
00043 int y, u, v;
00044 double cr, cg, cb, cu, cv;
00045 char name[128];
00046 unsigned char *yp, *up, *vp;
00047 static unsigned char *u444, *v444, *u422, *v422;
00048 static double coef[7][3] = {
00049 {0.2125,0.7154,0.0721},
00050 {0.299, 0.587, 0.114},
00051 {0.299, 0.587, 0.114},
00052 {0.30, 0.59, 0.11},
00053 {0.299, 0.587, 0.114},
00054 {0.299, 0.587, 0.114},
00055 {0.212, 0.701, 0.087}};
00056 static long rtoy_tab[256], gtoy_tab[256], btoy_tab[256];
00057 static long rtou_tab[256], gtou_tab[256], btou_tab[256];
00058 static long rtov_tab[256], gtov_tab[256], btov_tab[256];
00059 static int need_tables = 1;
00060 int colormodel;
00061 long real_number;
00062
00063 i = matrix_coefficients;
00064 if(i > 8) i = 3;
00065
00066 cr = coef[i - 1][0];
00067 cg = coef[i - 1][1];
00068 cb = coef[i - 1][2];
00069 cu = 0.5 / (1.0 - cb);
00070 cv = 0.5 / (1.0 - cr);
00071
00072
00073 if(chroma_format == CHROMA444)
00074 {
00075
00076 u444 = frame[1];
00077 v444 = frame[2];
00078 }
00079 else
00080 {
00081 if (!u444)
00082 {
00083 if (!(u444 = (unsigned char *)malloc(width*height)))
00084 error("malloc failed");
00085 if (!(v444 = (unsigned char *)malloc(width*height)))
00086 error("malloc failed");
00087 if (chroma_format==CHROMA420)
00088 {
00089 if (!(u422 = (unsigned char *)malloc((width>>1)*height)))
00090 error("malloc failed");
00091 if (!(v422 = (unsigned char *)malloc((width>>1)*height)))
00092 error("malloc failed");
00093 }
00094 }
00095 }
00096
00097
00098 if(need_tables)
00099 {
00100 for(i = 0; i < 256; i++)
00101 {
00102 rtoy_tab[i] = (long)( 0.2990 * 65536 * i);
00103 rtou_tab[i] = (long)(-0.1687 * 65536 * i);
00104 rtov_tab[i] = (long)( 0.5000 * 65536 * i);
00105
00106 gtoy_tab[i] = (long)( 0.5870 * 65536 * i);
00107 gtou_tab[i] = (long)(-0.3320 * 65536 * i);
00108 gtov_tab[i] = (long)(-0.4187 * 65536 * i);
00109
00110 btoy_tab[i] = (long)( 0.1140 * 65536 * i);
00111 btou_tab[i] = (long)( 0.5000 * 65536 * i);
00112 btov_tab[i] = (long)(-0.0813 * 65536 * i);
00113 }
00114 need_tables = 0;
00115 }
00116
00117 real_number = (long)((double)quicktime_frame_rate(qt_file, 0) /
00118 frame_rate *
00119 number +
00120 0.5);
00121 quicktime_set_video_position(qt_file,
00122 real_number,
00123 0);
00124
00125
00126 quicktime_set_row_span(qt_file, width);
00127 quicktime_set_window(qt_file,
00128 0,
00129 0,
00130 horizontal_size,
00131 vertical_size,
00132 horizontal_size,
00133 vertical_size);
00134 quicktime_set_cmodel(qt_file, (chroma_format == 1) ? BC_YUV420P : BC_YUV422P);
00135
00136 quicktime_decode_video(qt_file,
00137 frame,
00138 0);
00139
00140 }
00141
00142 static void read_mpeg(long number, unsigned char *frame[])
00143 {
00144 int i;
00145 char name[128];
00146 long real_number;
00147
00148
00149 real_number = (long)((double)mpeg3_frame_rate(mpeg_file, 0) /
00150 frame_rate *
00151 number +
00152 0.5);
00153
00154 while(mpeg3_get_frame(mpeg_file, 0) <= real_number)
00155 mpeg3_read_yuvframe(mpeg_file,
00156 frame[0],
00157 frame[1],
00158 frame[2],
00159 0,
00160 0,
00161 horizontal_size,
00162 vertical_size,
00163 0);
00164
00165 if(mpeg3_end_of_video(mpeg_file, 0)) frames_scaled = 1;
00166 }
00167
00168 static void read_stdin(long number, unsigned char *frame[])
00169 {
00170 int chroma_denominator = 1;
00171 unsigned char data[5];
00172
00173
00174 if(chroma_format == 1) chroma_denominator = 2;
00175
00176 fread(data, 4, 1, stdin_fd);
00177
00178
00179 if(data[0] == 0xff && data[1] == 0xff && data[2] == 0xff && data[3] == 0xff)
00180 {
00181 frames_scaled = 0;
00182 return;
00183 }
00184
00185 fread(frame[0], width * height, 1, stdin_fd);
00186 fread(frame[1], width / 2 * height / chroma_denominator, 1, stdin_fd);
00187 fread(frame[2], width / 2 * height / chroma_denominator, 1, stdin_fd);
00188 }
00189
00190 static void read_buffers(long number, unsigned char *frame[])
00191 {
00192 int chroma_denominator = 1;
00193 unsigned char data[5];
00194
00195 if(chroma_format == 1) chroma_denominator = 2;
00196
00197 pthread_mutex_lock(&input_lock);
00198
00199 if(input_buffer_end)
00200 {
00201 frames_scaled = 0;
00202 pthread_mutex_unlock(©_lock);
00203 pthread_mutex_unlock(&output_lock);
00204 return;
00205 }
00206
00207 memcpy(frame[0], input_buffer_y, width * height);
00208 memcpy(frame[1], input_buffer_u, width / 2 * height / chroma_denominator);
00209 memcpy(frame[2], input_buffer_v, width / 2 * height / chroma_denominator);
00210 pthread_mutex_unlock(©_lock);
00211 pthread_mutex_unlock(&output_lock);
00212 }
00213
00214 void readframe(int frame_num, uint8_t *frame[])
00215 {
00216 int n;
00217 n = frame_num % (2 * READ_LOOK_AHEAD);
00218
00219 frame[0] = frame_buffers[n][0];
00220 frame[1] = frame_buffers[n][1];
00221 frame[2] = frame_buffers[n][2];
00222
00223
00224 switch (inputtype)
00225 {
00226 case T_QUICKTIME:
00227 read_quicktime(frame, frame_num);
00228 break;
00229 case T_MPEG:
00230 read_mpeg(frame_num, frame);
00231 break;
00232 case T_STDIN:
00233 read_stdin(frame_num, frame);
00234 break;
00235 case T_BUFFERS:
00236 read_buffers(frame_num, frame);
00237 break;
00238 default:
00239 break;
00240 }
00241 }