/**************************************************************************** * PROJECT: Changes for Squeak * FILE: changesForSqueak.c * CONTENT: * * AUTHOR: John McIntosh, and others. * ADDRESS: * EMAIL: johnmci@smalltalkconsulting.com * RCSID: $Id: changesForSqueak.c 2414 2011-06-09 08:30:40Z andreas $ * * NOTES: See change log below. * 12/27/2001 JMM added support to build as a OS-X Bundle, a bit werid because its a mixture of unix and mac OS *****************************************************************************/ /* Squeak on MPEG by John M McIntosh johnmci#smalltalkconsulting.com Sept 2000 For the macintosh I've 1) coded up #ifdef for TARGET_OS_MAC 2) Coded around the pthreads 3) ignored most of mpeg3io_device 4) some changes to make CodeWarrior 5 happy In General 1) Added some casts 2) had some problems with Mpeg3_stream_coeffs_t 3) coded up memoryAllocate/memoryFree versus malloc/cmalloc/free 4) created a mpeg3_generate_toc_for_Squeak 5) Ignore perror */ // Nov 2nd, 2000 JMM changed memoryAllocate, use calloc // Sept 7nd, 2001 JMM added carbon logic // May 31st, 2002 JMM a few additions to make it compile on the mac with latest code #include #include "mpeg3private.h" #include "changesForSqueak.h" #if defined(TARGET_OS_MAC) && !defined ( __APPLE__ ) && !defined ( __MACH__ ) #include #include #include "sq.h" #endif #ifdef WIN32 #include #endif mpeg3_demuxer_t* mpeg3_new_demuxer(mpeg3_t *file, int do_audio, int do_video, int stream_id); mpeg3_title_t* mpeg3_new_title(mpeg3_t *file, char *path); mpeg3demux_timecode_t* mpeg3_append_timecode(mpeg3_demuxer_t *demuxer, mpeg3_title_t *title, long prev_byte, double prev_time, long next_byte, double next_time, int dont_store); void appendStringToBufferIfPossible(char *buffer,char *append,int bufferSize); static long counter = 0; void * memoryAllocate(int number,unsigned size) { void * stuff; #if defined(TARGET_OS_MAC) && !defined ( __APPLE__ ) && !defined ( __MACH__ ) #if TARGET_API_MAC_CARBON stuff = (void *) NewPtrClear(size*number); #else stuff = (void *) NewPtrSysClear(size*number); #endif // if (stuff == nil) Debugger(); #else stuff = (void *) calloc(size,number); #endif counter++; return stuff; } void memoryFree(void *stuff) { counter--; #if defined(TARGET_OS_MAC) && !defined ( __APPLE__ ) && !defined ( __MACH__ ) DisposePtr((char *)stuff); #else free(stuff); #endif } #if (defined(TARGET_OS_MAC) && !defined ( __APPLE__ ) && !defined ( __MACH__ )) || defined(WIN32) #define NEEDSTRFUNCS #endif #ifdef NEEDSTRFUNCS void perror(const char * string) { } int strncasecmp(const char *str1, const char *str2, size_t nchars); int strcasecmp (const char *str1, const char *str2); int strncasecmp(const char *s1, const char *s2, size_t len) { /* Return true if the two strings are the same, not considering case. */ int i, c1, c2; for (i = 0; i < len; i++) { c1 = s1[i]; c2 = s2[i]; if ((c1 >= 'a') && (c1 <= 'z')) { c1 = c1 - ('a' - 'A'); } if ((c2 >= 'a') && (c2 <= 'z')) { c2 = c2 - ('a' - 'A'); } if (c1 != c2) return 0; } return 1; } int strcasecmp (const char *str1, const char *str2) { if (strlen(str1) != strlen(str2)) return 0; return strncasecmp(str1,str2,strlen(str1)); } #endif #ifdef WIN32 int bzero(char* block, long size) { ZeroMemory(block,size); } #endif #if defined(TARGET_OS_MAC) && !defined ( __APPLE__ ) && !defined ( __MACH__ ) int bzero(char *block,long size) { BlockZero(block,size); } int main () { } #endif #if defined(TARGET_OS_MAC) && defined ( __APPLE__ ) && defined ( __MACH__ ) int isSystem9_0_or_better(void) { return 1; } #endif void appendStringToBufferIfPossible(char *buffer,char *append,int bufferSize) { if (strlen(append) + strlen(buffer) < bufferSize) strcat(buffer,append); } int mpeg3_generate_toc_for_Squeak(mpeg3_t *file, int timecode_search, int print_streams, char *buffer, int bufferSize) { mpeg3_demuxer_t *demuxer; int i; char temp_buffer[256]; if(file) { buffer[0] = 0x00; demuxer = mpeg3_new_demuxer(file, 0, 0, -1); mpeg3demux_create_title_for_Squeak(demuxer, timecode_search, buffer, bufferSize); /* Just print the first title's streams */ if(print_streams) mpeg3demux_print_streams_for_Squeak(demuxer, buffer,bufferSize); sprintf(temp_buffer, "SIZE: %ld\n", demuxer->titles[demuxer->current_title]->total_bytes); appendStringToBufferIfPossible(buffer,temp_buffer,bufferSize); sprintf(temp_buffer, "PACKETSIZE: %ld\n", demuxer->packet_size); appendStringToBufferIfPossible(buffer,temp_buffer,bufferSize); mpeg3demux_print_timecodes(demuxer->titles[demuxer->current_title], buffer); mpeg3_delete_demuxer(demuxer); return 0; } return 1; } /* Create a title. */ /* Build a table of timecodes contained in the program stream. */ /* If toc is 0 just read the first and last timecode. */ int mpeg3demux_create_title_for_Squeak(mpeg3_demuxer_t *demuxer, int timecode_search, char *buffer,int buffer_size) { int result = 0, done = 0, counter_start, counter; mpeg3_t *file = (mpeg3_t *) demuxer->file; long next_byte=0, prev_byte=0; double next_time, prev_time, absolute_time; long i; mpeg3_title_t *title; unsigned long test_header = 0; mpeg3demux_timecode_t *timecode = 0; char temp_buffer[256]; demuxer->error_flag = 0; demuxer->generating_timecode = 1; /* Create a single title */ if(!demuxer->total_titles) { demuxer->titles[0] = mpeg3_new_title(file, file->fs->path); demuxer->total_titles = 1; mpeg3demux_open_title(demuxer, 0); } title = demuxer->titles[0]; title->total_bytes = mpeg3io_total_bytes(title->fs); /* Get the packet size from the file */ if(file->is_program_stream) { mpeg3io_seek(title->fs, 4); for(i = 0; i < MPEG3_MAX_PACKSIZE && test_header != MPEG3_PACK_START_CODE; i++) { test_header <<= 8; test_header |= mpeg3io_read_char(title->fs); } if(i < MPEG3_MAX_PACKSIZE) demuxer->packet_size = i; mpeg3io_seek(title->fs, 0); } else demuxer->packet_size = file->packet_size; /* Get timecodes for the title */ if(file->is_transport_stream || file->is_program_stream) { mpeg3io_seek(title->fs, 0); while(!done && !result && !mpeg3io_eof(title->fs)) { next_byte = mpeg3io_tell(title->fs); result = mpeg3_read_next_packet(demuxer); if(!result) { next_time = demuxer->time; sprintf(temp_buffer,"%f %f\n", next_time, prev_time); appendStringToBufferIfPossible(buffer,temp_buffer,buffer_size); if(next_time < prev_time || next_time - prev_time > MPEG3_CONTIGUOUS_THRESHOLD || !title->timecode_table_size) { /* Discontinuous */ timecode = mpeg3_append_timecode(demuxer, title, prev_byte, prev_time, next_byte, next_time, 0); sprintf(temp_buffer,"timecode: %ld %ld %f %f\n", timecode->start_byte, timecode->end_byte, timecode->start_time, timecode->end_time); appendStringToBufferIfPossible(buffer,temp_buffer,buffer_size); counter_start = next_time; } prev_time = next_time; prev_byte = next_byte; counter = next_time; } /* Just get the first bytes if not building a toc to get the stream ID's. */ if(next_byte > 0x100000 && (!timecode_search || !buffer)) done = 1; } /* Get the last timecode */ if(!buffer || !timecode_search) { result = mpeg3io_seek(title->fs, title->total_bytes); if(!result) result = mpeg3_read_prev_packet(demuxer); } if(title->timecode_table && timecode) { timecode->end_byte = title->total_bytes; // timecode->end_byte = mpeg3io_tell(title->fs)/* + demuxer->packet_size */; timecode->end_time = demuxer->time; timecode->absolute_end_time = timecode->end_time - timecode->start_time; } } mpeg3io_seek(title->fs, 0); demuxer->generating_timecode = 0; return 0; } int mpeg3demux_print_streams_for_Squeak(mpeg3_demuxer_t *demuxer, char *buffer,int buffer_size) { int i; char temp_buffer[256]; /* Print the stream information */ for(i = 0; i < MPEG3_MAX_STREAMS; i++) { if(demuxer->astream_table[i]) { sprintf(temp_buffer, "ASTREAM: %d %d\n", i, demuxer->astream_table[i]); appendStringToBufferIfPossible(buffer,temp_buffer,buffer_size); } if(demuxer->vstream_table[i]) { sprintf(temp_buffer, "VSTREAM: %d %d\n", i, demuxer->vstream_table[i]); appendStringToBufferIfPossible(buffer,temp_buffer,buffer_size); } } return 0; } mpeg3_css_t* mpeg3_new_css() { return 0; } int mpeg3_delete_css(mpeg3_css_t *css) { return 0; } int mpeg3_get_keys(mpeg3_css_t *css, char *path) { return 1; } int mpeg3_decrypt_packet(mpeg3_css_t *css, unsigned char *sector) { return 1; } /*** System Attributes ***/ int IsImageName(char *name) { char *suffix; suffix = strrchr(name, '.'); /* pointer to last period in name */ if (suffix == NULL) return 0; if (strcmp(suffix, ".ima") == 0) return 1; if (strcmp(suffix, ".image") == 0) return 1; if (strcmp(suffix, ".IMA") == 0) return 1; if (strcmp(suffix, ".IMAGE") == 0) return 1; return 0; }