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

xdvshow-file.c File Reference

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <pthread.h>
#include <assert.h>
#include <libdv/dv_types.h>
#include <semaphore.h>
#include <errno.h>
#include "xdvshow-shm.h"
#include "xdvshow-flags.h"
#include "xdvshow-file.h"
#include "xdvshow-const.h"
#include "xdvshow-defs.h"

Include dependency graph for xdvshow-file.c:

Include dependency graph

Go to the source code of this file.

Functions

int _xdvshow_read_file __P ((void))
void * xdvshow_prepare_file (void *data)
 Public function for handling the input file.

void xdvshow_close_file ()
 Public function for closing input file.

int _xdvshow_read_file ()
 Internal function for reading and parsing the input file.


Variables

int _file
 File descriptor for reading from input file.


Function Documentation

int _xdvshow_read_file __P (void)   )  [static]
 

int _xdvshow_read_file  )  [static]
 

Internal function for reading and parsing the input file.

Returns:
0 on success, -1 on failure

Definition at line 101 of file xdvshow-file.c.

References _file, _xdvshow_shm, audio_empty, audio_ready, __xdvshow_shm::audio_shm_frame, shm_frame_buf::data, DPRINT, DPRINT_BARE, DSEQ_MAX_NTSC, DSEQ_MAX_PAL, dv_format_type, DVFRAME_DATA_READY, DVFRAME_MAX_SIZE, flags_format_normal, flags_format_wide, flags_use_audio, shm_frame::frame_buf, shm_frame_buf::lock, shm_frame::next, SCT_AAUX, SCT_AUDIO, SCT_HEADER, SCT_SUBCODE, SCT_VAUX, SCT_VIDEO, __xdvshow_shm::shm_frame, ts_sem_wait, video_empty, and video_ready.

Referenced by xdvshow_prepare_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 }

void xdvshow_close_file  ) 
 

Public function for closing input file.

The function closes input file usinf _file file descriptor. The function has void type and it is used in xdvshow-main.c for registering function pointer.

Definition at line 89 of file xdvshow-file.c.

References _file.

Referenced by main(), and xdvshow_prepare_file().

00090 { 00091 if(close(_file) != 0) { 00092 perror("closing file failed"); 00093 } 00094 }

void* xdvshow_prepare_file void *  data  ) 
 

Public function for handling the input file.

Parameters:
data is input filename (char *)
Returns:
NULL on success, -1 on failure

Definition at line 37 of file xdvshow-file.c.

References _file, _xdvshow_alloc_shm(), _xdvshow_attach_shm(), _xdvshow_read_file(), and xdvshow_close_file().

Referenced by main().

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 }

Here is the call graph for this function:


Variable Documentation

int _file
 

File descriptor for reading from input file.

Definition at line 29 of file xdvshow-file.c.

Referenced by _xdvshow_read_file(), xdvshow_close_file(), and xdvshow_prepare_file().


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