00102 {
00103 ssize_t n;
00104
00105 u_char *dvdata;
00106 u_char *audio_dvdata;
00107
00108
#ifdef DEBUG
00109
int sem_value = 0;
00110
int frame_length = 0;
00111
int iDebugSemVal;
00112
#endif
00113
00114 u_int32_t dvdif[80 / 4];
00115
unsigned int sct, dseq, dbn;
00116
00117
unsigned int dseq_max;
00118
unsigned int dseq_stream_max = 0;
00119
unsigned int dseq_stream_max_count = 0;
00120
00121
switch (
dv_format_type) {
00122
case e_dv_system_525_60:
00123 dseq_max =
DSEQ_MAX_NTSC;
00124
break;
00125
00126
case e_dv_system_625_50:
00127 dseq_max =
DSEQ_MAX_PAL;
00128
break;
00129
00130
default:
00131
return(-1);
00132 }
00133
00134 dvdata =
_xdvshow_shm.
shm_frame->
frame_buf->
data;
00135 audio_dvdata =
_xdvshow_shm.
audio_shm_frame->
frame_buf->
data;
00136
00137
while (1) {
00138
00139 n = read(_file, (
char *)&dvdif, 80);
00140
if (n < 1) {
00141
if (n == 0) {
00142
return(0);
00143 }
00144 perror(
"read");
00145
return(-1);
00146 }
00147
00148
#ifdef DEBUG
00149
frame_length += n;
00150
#endif
00151
00152
DPRINT_BARE(
".");
00153
00154 dbn = (ntohl(dvdif[0]) >> 8) & 0xff;
00155 dseq = (ntohl(dvdif[0]) >> 20) & 0xf;
00156 sct = (ntohl(dvdif[0]) >> 29) & 0x7;
00157
00158
if (sct > 4) {
00159
DPRINT_BARE(
"\n");
00160
DPRINT(
"Data error: SCT > 4! sct = %d\n", sct);
00161
continue;
00162 }
00163
00164
if (dseq > dseq_max) {
00165
DPRINT_BARE(
"\n");
00166
DPRINT(
"Data error: DSEQ > DSEQ_MAX! dseq = %d, dseq_max = %d\n", dseq, dseq_max);
00167 }
00168
if (dseq >
DSEQ_MAX_PAL) {
00169
DPRINT_BARE(
"\n");
00170
DPRINT(
"Data error: DSEQ > DSEQ_MAX_PAL! dseq = %d, DSEQ_MAX_PAL = %d\n", dseq, DSEQ_MAX_PAL);
00171
continue;
00172 }
00173
00174
if (dseq_stream_max_count >= 255) {
00175
if (dseq_stream_max != dseq_max &&(dseq_stream_max ==
DSEQ_MAX_PAL || dseq_stream_max ==
DSEQ_MAX_NTSC)) {
00176 dseq_max = dseq_stream_max;
00177 }
00178 dseq_stream_max_count = 0;
00179 dseq_stream_max = 0;
00180 }
else {
00181
if (dseq_stream_max < dseq) {
00182 dseq_stream_max = dseq;
00183 }
00184 ++dseq_stream_max_count;
00185 }
00186
00187
switch (sct) {
00188
case SCT_HEADER:
00189
if ((dseq * 150 * 80) <= (
DVFRAME_MAX_SIZE - 80)) {
00190 memcpy(&dvdata[dseq * 150 * 80], &dvdif, 80);
00191 }
else {
00192
DPRINT_BARE(
"\n");
00193
DPRINT(
"memcpy droped - dvdata size %d exceeded by %d\n dseq = %d\n", DVFRAME_MAX_SIZE, ((dseq * 150 * 80) - DVFRAME_MAX_SIZE + 80), dbn);
00194 }
00195
break;
00196
00197
case SCT_SUBCODE:
00198
if (dbn > 1) {
00199
DPRINT_BARE(
"\n");
00200
DPRINT(
"Data error: DBN > 1\ndbn = %d\n", dbn);
00201
break;
00202 }
00203
if((dseq * 150 + 1 + dbn) *80 <= (
DVFRAME_MAX_SIZE - 80)) {
00204 memcpy(&dvdata[(dseq * 150 + 1 + dbn) * 80], &dvdif, 80);
00205 }
else {
00206
DPRINT_BARE(
"\n");
00207
DPRINT(
"memcpy dropped - dvdata size %d exceeded by %d\ndseq = %d\n", DVFRAME_MAX_SIZE, ((dseq * 150 + 1 + dbn)* 80 - DVFRAME_MAX_SIZE + 80), dbn);
00208 }
00209
break;
00210
00211
case SCT_AAUX:
00212
break;
00213
00214
case SCT_VAUX:
00215
if (dbn > 2) {
00216
DPRINT_BARE(
"\n");
00217
DPRINT(
"Data error: DBN > 2\ndbn = %d\n", dbn);
00218 }
00219
if((dseq * 150 + dbn + 3)*80 <= (
DVFRAME_MAX_SIZE - 80)) {
00220 memcpy(&dvdata[(dseq * 150 + dbn + 3) * 80], &dvdif, 80);
00221 }
else {
00222
DPRINT_BARE(
"\n");
00223
DPRINT(
"memcpy dropped - dvdata size %d exceeded by %d\ndseq = %d, dbn = %d\n", DVFRAME_MAX_SIZE, ((dseq * 150 + 6 + dbn * 16)*80 - DVFRAME_MAX_SIZE + 80), dseq, dbn);
00224 }
00225
break;
00226
00227
case SCT_AUDIO:
00228
if (dbn > 8) {
00229
DPRINT_BARE(
"\n");
00230
DPRINT(
"Data error: DBN > 8\ndbn = %d\n", dbn);
00231
break;
00232 }
00233
DPRINT_BARE(
"*");
00234
if ((dseq * 150 + 6 + dbn * 16)*80 <= (
DVFRAME_MAX_SIZE - 80)) {
00235 memcpy(&dvdata[(dseq * 150 + 6 + dbn*16) * 80], &dvdif, 80);
00236 }
else {
00237
DPRINT_BARE(
"\n");
00238
DPRINT(
"memcpy dropped - dvdata size %d exceeded by %d\ndseq = %d, dbn = %d\n", DVFRAME_MAX_SIZE, ((dseq * 150 + 6 + dbn * 16)*80 - DVFRAME_MAX_SIZE + 80), dseq, dbn);
00239
break;
00240 }
00241
00242
if (
flags_use_audio) {
00243
DPRINT_BARE(
"(*)");
00244
if((dseq * 150 + 6 + dbn * 16) * 80 <= (
DVFRAME_MAX_SIZE - 80)) {
00245 memcpy(&audio_dvdata[(dseq * 150 + 6 + dbn * 16) * 80], &dvdif, 80);
00246 }
else {
00247
DPRINT_BARE(
"\n");
00248
DPRINT(
"memcpy dropped - dvdata size %d exceeded by %d\ndseq = %d, dbn = %d\n", DVFRAME_MAX_SIZE, ((dseq * 150 + 6 + dbn * 16)*80 - DVFRAME_MAX_SIZE + 80), dseq, dbn);
00249
break;
00250 }
00251
00252
if (dseq == dseq_max && dbn == 8) {
00253
00254
#ifdef DEBUG
00255
if (sem_getvalue(&audio_ready, &iDebugSemVal)) {
00256 perror(
"Unable to get value of audio_ready semaphore!");
00257 exit(EXIT_FAILURE);
00258 }
00259
00260
DPRINT(
"semaphore audio_ready value: %d\n", iDebugSemVal);
00261
00262
if (sem_getvalue(&audio_empty, &iDebugSemVal)) {
00263 perror(
"Unable to get value of audio_empty semaphore!");
00264 exit(EXIT_FAILURE);
00265 }
00266
00267
DPRINT(
"semaphore audio_empty value: %d\n", iDebugSemVal);
00268
#endif
00269
00270
if ( !( ((
flags_format_normal == 0) && (
flags_format_wide == 0))
00271 || ((
flags_format_normal != 0) && (
flags_format_wide != 0)) ) )
00272 {
00273 sem_post(&audio_ready);
00274
ts_sem_wait(&audio_empty);
00275 }
00276
00277
_xdvshow_shm.
audio_shm_frame =
_xdvshow_shm.
audio_shm_frame->
next;
00278 audio_dvdata =
_xdvshow_shm.
audio_shm_frame->
frame_buf->
data;
00279 }
00280 }
00281
00282
00283
break;
00284
00285
case SCT_VIDEO:
00286 memcpy(&dvdata[(dseq * 150 + 7 + dbn + dbn/15) * 80], &dvdif, 80);
00287
if (dseq == dseq_max && dbn == 134) {
00288
_xdvshow_shm.
shm_frame->
frame_buf->
lock =
DVFRAME_DATA_READY;
00289
00290
#ifdef DEBUG
00291
DPRINT(
"RECEIVED frame length: %d.\n", frame_length);
00292 frame_length = 0;
00293
00294
DPRINT(
"RECEIVED frame no. %d\n", sem_value++);
00295
00296
if(sem_getvalue(&video_ready, &iDebugSemVal)) {
00297 perror(
"Unable to get value of video_ready semaphore!");
00298 exit(EXIT_FAILURE);
00299 }
00300
DPRINT(
"semaphore video_ready value: %d\n", iDebugSemVal);
00301
00302
if(sem_getvalue(&video_empty, &iDebugSemVal)) {
00303 perror(
"Unable to get value of video_empty semaphore!");
00304 exit(EXIT_FAILURE);
00305 }
00306
DPRINT(
"semaphore video_empty value: %d\n", iDebugSemVal);
00307
#endif
00308
00309
if (sem_post(&video_ready) < 0) {
00310 perror(
"sem_post");
00311 assert(0);
00312 }
00313
ts_sem_wait(&video_empty);
00314
00315
_xdvshow_shm.
shm_frame =
_xdvshow_shm.
shm_frame->
next;
00316 dvdata =
_xdvshow_shm.
shm_frame->
frame_buf->
data;
00317 }
00318
break;
00319
00320
default:
00321 fprintf(stderr,
"SCT: %d\n", sct);
00322 fprintf(stderr,
"INVALID FILE FORMAT!!!\n");
00323
return(-1);
00324 }
00325 }
00326
00327
00328 assert(0);
00329
return(-1);
00330 }