1 /* readpic.c, read source pictures */
3 /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
6 * Disclaimer of Warranty
8 * These software programs are available to the user without any license fee or
9 * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
10 * any and all warranties, whether express, implied, or statuary, including any
11 * implied warranties or merchantability or of fitness for a particular
12 * purpose. In no event shall the copyright-holder be liable for any
13 * incidental, punitive, or consequential damages of any kind whatsoever
14 * arising from the use of these programs.
16 * This disclaimer of warranty extends to the user of these programs and user's
17 * customers, employees, agents, transferees, successors, and assigns.
19 * The MPEG Software Simulation Group does not represent or warrant that the
20 * programs furnished hereunder are free of infringement of any third-party
23 * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
24 * are subject to royalty fees to patent holders. Many of these patents are
25 * general enough such that they are unavoidable regardless of implementation
32 #include "colormodels.h"
37 static void read_quicktime(frame
, number
)
38 unsigned char *frame
[];
44 double cr
, cg
, cb
, cu
, cv
;
46 unsigned char *yp
, *up
, *vp
;
47 static unsigned char *u444
, *v444
, *u422
, *v422
;
48 static double coef
[7][3] = {
49 {0.2125,0.7154,0.0721}, /* ITU-R Rec. 709 (1990) */
50 {0.299, 0.587, 0.114}, /* unspecified */
51 {0.299, 0.587, 0.114}, /* reserved */
52 {0.30, 0.59, 0.11}, /* FCC */
53 {0.299, 0.587, 0.114}, /* ITU-R Rec. 624-4 System B, G */
54 {0.299, 0.587, 0.114}, /* SMPTE 170M */
55 {0.212, 0.701, 0.087}}; /* SMPTE 240M (1987) */
56 static long rtoy_tab
[256], gtoy_tab
[256], btoy_tab
[256];
57 static long rtou_tab
[256], gtou_tab
[256], btou_tab
[256];
58 static long rtov_tab
[256], gtov_tab
[256], btov_tab
[256];
59 static int need_tables
= 1; // Initialize tables on first read
63 i
= matrix_coefficients
;
69 cu
= 0.5 / (1.0 - cb
);
70 cv
= 0.5 / (1.0 - cr
);
72 // Allocate output buffers
73 if(chroma_format
== CHROMA444
)
75 // Not supported by libMPEG3
83 if (!(u444
= (unsigned char *)malloc(width
*height
)))
84 error("malloc failed");
85 if (!(v444
= (unsigned char *)malloc(width
*height
)))
86 error("malloc failed");
87 if (chroma_format
==CHROMA420
)
89 if (!(u422
= (unsigned char *)malloc((width
>>1)*height
)))
90 error("malloc failed");
91 if (!(v422
= (unsigned char *)malloc((width
>>1)*height
)))
92 error("malloc failed");
97 // Initialize YUV tables
100 for(i
= 0; i
< 256; i
++)
102 rtoy_tab
[i
] = (long)( 0.2990 * 65536 * i
);
103 rtou_tab
[i
] = (long)(-0.1687 * 65536 * i
);
104 rtov_tab
[i
] = (long)( 0.5000 * 65536 * i
);
106 gtoy_tab
[i
] = (long)( 0.5870 * 65536 * i
);
107 gtou_tab
[i
] = (long)(-0.3320 * 65536 * i
);
108 gtov_tab
[i
] = (long)(-0.4187 * 65536 * i
);
110 btoy_tab
[i
] = (long)( 0.1140 * 65536 * i
);
111 btou_tab
[i
] = (long)( 0.5000 * 65536 * i
);
112 btov_tab
[i
] = (long)(-0.0813 * 65536 * i
);
117 real_number
= (long)((double)quicktime_frame_rate(qt_file
, 0) /
121 quicktime_set_video_position(qt_file
,
125 //printf("readframe 1 %d %d\n", width, height);
126 quicktime_set_row_span(qt_file
, width
);
127 quicktime_set_window(qt_file
,
134 quicktime_set_cmodel(qt_file
, (chroma_format
== 1) ? BC_YUV420P
: BC_YUV422P
);
136 quicktime_decode_video(qt_file
,
139 //printf("readframe 2\n");
142 static void read_mpeg(long number
, unsigned char *frame
[])
148 // Normalize frame_rate
149 real_number
= (long)((double)mpeg3_frame_rate(mpeg_file
, 0) /
154 while(mpeg3_get_frame(mpeg_file
, 0) <= real_number
)
155 mpeg3_read_yuvframe(mpeg_file
,
164 /* Terminate encoding after processing this frame */
165 if(mpeg3_end_of_video(mpeg_file
, 0)) frames_scaled
= 1;
168 static void read_stdin(long number
, unsigned char *frame
[])
170 int chroma_denominator
= 1;
171 unsigned char data
[5];
174 if(chroma_format
== 1) chroma_denominator
= 2;
176 fread(data
, 4, 1, stdin_fd
);
178 // Terminate encoding before processing this frame
179 if(data
[0] == 0xff && data
[1] == 0xff && data
[2] == 0xff && data
[3] == 0xff)
185 fread(frame
[0], width
* height
, 1, stdin_fd
);
186 fread(frame
[1], width
/ 2 * height
/ chroma_denominator
, 1, stdin_fd
);
187 fread(frame
[2], width
/ 2 * height
/ chroma_denominator
, 1, stdin_fd
);
190 static void read_buffers(long number
, unsigned char *frame
[])
192 int chroma_denominator
= 1;
193 unsigned char data
[5];
195 if(chroma_format
== 1) chroma_denominator
= 2;
197 pthread_mutex_lock(&input_lock
);
202 pthread_mutex_unlock(©_lock
);
203 pthread_mutex_unlock(&output_lock
);
207 memcpy(frame
[0], input_buffer_y
, width
* height
);
208 memcpy(frame
[1], input_buffer_u
, width
/ 2 * height
/ chroma_denominator
);
209 memcpy(frame
[2], input_buffer_v
, width
/ 2 * height
/ chroma_denominator
);
210 pthread_mutex_unlock(©_lock
);
211 pthread_mutex_unlock(&output_lock
);
214 void readframe(int frame_num
, uint8_t *frame
[])
217 n
= frame_num
% (2 * READ_LOOK_AHEAD
);
219 frame
[0] = frame_buffers
[n
][0];
220 frame
[1] = frame_buffers
[n
][1];
221 frame
[2] = frame_buffers
[n
][2];
227 read_quicktime(frame
, frame_num
);
230 read_mpeg(frame_num
, frame
);
233 read_stdin(frame_num
, frame
);
236 read_buffers(frame_num
, frame
);