Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals

xdvshow-file.c

Go to the documentation of this file.
00001 #ifdef HAVE_CONFIG_H 00002 #include <config.h> 00003 #endif /* HAVE_CONFIG_H */ 00004 00005 #include <stdio.h> 00006 #include <unistd.h> 00007 #include <string.h> 00008 #include <sys/types.h> 00009 #include <sys/stat.h> 00010 #include <fcntl.h> 00011 #include <signal.h> 00012 #include <pthread.h> 00013 #include <assert.h> 00014 00015 #include <libdv/dv_types.h> 00016 #include <semaphore.h> 00017 #include <errno.h> 00018 00019 #include "xdvshow-shm.h" 00020 #include "xdvshow-flags.h" 00021 #include "xdvshow-file.h" 00022 #include "xdvshow-const.h" 00023 #include "xdvshow-defs.h" 00024 00025 static int _xdvshow_read_file __P((void)); 00026 00029 int _file; 00030 00036 void * 00037 xdvshow_prepare_file(void *data) 00038 { 00039 char *filename = data; 00040 int ret; 00041 00042 ret = _xdvshow_alloc_shm(); 00043 if (ret < 0) { 00044 return((void *)1); 00045 } 00046 00047 ret = _xdvshow_attach_shm(); 00048 assert(ret==1); 00049 00050 if (filename == NULL) { 00051 return((void *)-1); 00052 } 00053 00054 _file = open(filename, O_RDONLY); 00055 if (_file == -1) { 00056 perror("open"); 00057 00058 if (kill(getpid(), SIGINT) != 0) { 00059 perror("killing failed"); 00060 return((void *)-1); 00061 } 00062 00063 return((void *)-1); 00064 } 00065 00066 /* THIS IS SUPPOSED TO COME BACK AT THE END OF FILE */ 00067 if(_xdvshow_read_file() != 0) { 00068 xdvshow_close_file(); 00069 return((void *)-1); 00070 } 00071 00072 xdvshow_close_file(); 00073 00074 if (kill(getpid(), SIGINT) != 0) { 00075 perror("killing failed"); 00076 return((void *)-1); 00077 } 00078 00079 return NULL; 00080 } 00081 00088 void 00089 xdvshow_close_file() 00090 { 00091 if(close(_file) != 0) { 00092 perror("closing file failed"); 00093 } 00094 } 00095 00100 static int 00101 _xdvshow_read_file() 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 /* DEBUG */ 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) { /*eof*/ 00142 return(0); 00143 } 00144 perror("read"); 00145 return(-1); 00146 } 00147 00148 #ifdef DEBUG 00149 frame_length += n; 00150 #endif /* DEBUG */ 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 /* DEBUG */ 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 /* DEBUG */ 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 /* This should be unreachable but it must be verified. */ 00328 assert(0); 00329 return(-1); 00330 }

Generated on Wed Nov 3 19:19:02 2004 for xdvshow by doxygen 1.3.7