[Vm-dev] [commit] r2414 - Merging support files from cogvm branch.
commits at squeakvm.org
commits at squeakvm.org
Thu Jun 9 08:30:40 UTC 2011
Author: andreas
Date: 2011-06-09 01:30:40 -0700 (Thu, 09 Jun 2011)
New Revision: 2414
Modified:
trunk/platforms/Cross/plugins/Mpeg3Plugin/examplesSqueak.txt
trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/audio/mpeg3audio.c
trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/changesForSqueak.c
trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/mpeg3demux.c
trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/mpeg3io.c
trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/video/getpicture.c
trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/video/macroblocks.c
Log:
Merging support files from cogvm branch.
Modified: trunk/platforms/Cross/plugins/Mpeg3Plugin/examplesSqueak.txt
===================================================================
--- trunk/platforms/Cross/plugins/Mpeg3Plugin/examplesSqueak.txt 2011-06-09 08:29:00 UTC (rev 2413)
+++ trunk/platforms/Cross/plugins/Mpeg3Plugin/examplesSqueak.txt 2011-06-09 08:30:40 UTC (rev 2414)
@@ -1,128 +1,128 @@
-"Find a file"
-
-MPEGFile isFileValidMPEG: 'randomalien.mpg'.
-
-"Explore the file"
-
-| foo |
-foo _ MPEGFile openFile: 'randomalien.mpg'.
-foo hasVideo.
-foo hasAudio.
-foo endOfVideo: 0.
-foo endOfAudio: 0.
-foo audioChannels: 0.
-foo audioSamples: 0.
-foo audioGetSample: 0.
-foo audioSampleRate: 0.
-foo videoFrameRate: 0.
-foo videoGetFrame: 0.
-foo audioGetSample: 0.
-foo getTimeCode.
-foo videoPreviousFrame: 0.
-foo videoSetCPUs: 1.
-foo videoSetFrame: 44 stream: 0.
-foo setMMX: true.
-foo audioSetSample: 44 stream: 0.
-foo totalAudioStreams.
-foo totalVideoStreams.
-foo videoFrames: 0.
-foo videoFrameHeight: 0.
-foo videoFrameWidth: 0.
-foo seekPercentage: 0.5.
-foo getPercentage.
-foo videoSetCPUs: 1.
-foo setMMX: true.
-foo closeFile.
-
------------------------------------
-"Simply get the video start at 700 and run 50 frames then debug"
-"Better code is in the player, don't use this code, but it's an example"
-
-| foo x y counter fum |
-
-foo _ MPEGFile openFile: 'randomalien.mpg'.
-stream _ 0.
-counter _ 0.
-y _ foo videoFrameHeight: stream.
-x _ foo videoFrameWidth: stream.
-fum _ Form extent: x at y depth: 32.
-frames _ foo videoFrames: stream.
-foo videoSetFrame: 700 stream: stream.
-[foo endOfVideo: stream] whileFalse:
- [foo videoReadNextFrameInto: fum bits
- width: fum width height: fum height stream: stream.
- fum displayOn: Display.
- (counter _ counter + 1) == 50 ifTrue: [self halt]].
-foo closeFile.
-
------------------------------------
-"Play the audio"
-"There is more than one way to do this"
-"This is my first technically correct try"
-"DO not use this code, better code is in the player"
-
-| foo buffer sound soundOther |
-
-foo _ MPEGFile openFile: 'randomalien.mpg'.
-channels _ foo audioChannels: 0.
-sampleRate _ foo audioSampleRate: 0.
-totalSamples _ foo audioSamples: 0.
-buffer _ ByteArray new: 1024*1024*1.
-SoundPlayer startPlayerProcessBufferSize: 8192 rate: sampleRate stereo: true.
-
-result _ foo audioReadBuffer: buffer stream: 0 channel: 0 samples: 1024*1024//2.
-sound _ SampledSound samples:
- (SampledSound convertBytesTo16BitSamples: buffer mostSignificantByteFirst: true)
- samplingRate: sampleRate.
-
-result _ foo audioReReadBuffer: buffer stream: 0 channel: 1 samples: 1024*1024//2.
-soundOther _ SampledSound samples:
- (SampledSound convertBytesTo16BitSamples: buffer mostSignificantByteFirst: true)
- samplingRate: sampleRate.
-
-sound _ MixedSound new
- add: sound pan: 0;
- add: soundOther pan: 1.0.
-sound play
-
------------------------------------
-"Ok make it simple for Audio"
-
-| foo |
-form _ Form extent: 320 at 240 depth: 16.
-foo _ MPEGPlayer playFile: 'randomAlien.mpg' onForm: form.
-foo playAudioStreamWaitTilDone: 0.
-
------------------------------------
-"Ok make it simple for Video"
-| foo |
-form _ Form extent: 320 at 240 depth: 32.
-foo _ MPEGPlayer playFile: 'randomAlien.mpg' onForm: form.
-foo playVideoStreamWaitTilDone: 0.
-
------------------------------------
-"Play the video in the background"
-| foo |
-form _ Form extent: 320 at 240 depth: 16.
-foo _ MPEGPlayer playFile: 'randomAlien.mpg' onForm: form.
-foo playVideoStream: 0.
-foo inspect.
-
------------------------------------
-"Play both in the background"
-| foo |
-form _ Form extent: 320 at 240 depth: 16.
-foo _ MPEGPlayer playFile: 'randomAlien.mpg' onForm: form.
-foo playStream: 0.
-foo inspect.
-
--------------------------
-" In Morphic do "
-| foo |
-form _ Form extent: 320 at 240 depth: 32.
-morph _ SketchMorph withForm: form.
-morph openInWorld.
-foo _ MPEGPlayer playFile: 'randomAlien.mpg' onMorph: morph.
-foo morph: morph.
-foo playStream: 0.
-foo inspect.
+"Find a file"
+
+MPEGFile isFileValidMPEG: 'randomalien.mpg'.
+
+"Explore the file"
+
+| foo |
+foo _ MPEGFile openFile: 'randomalien.mpg'.
+foo hasVideo.
+foo hasAudio.
+foo endOfVideo: 0.
+foo endOfAudio: 0.
+foo audioChannels: 0.
+foo audioSamples: 0.
+foo audioGetSample: 0.
+foo audioSampleRate: 0.
+foo videoFrameRate: 0.
+foo videoGetFrame: 0.
+foo audioGetSample: 0.
+foo getTimeCode.
+foo videoPreviousFrame: 0.
+foo videoSetCPUs: 1.
+foo videoSetFrame: 44 stream: 0.
+foo setMMX: true.
+foo audioSetSample: 44 stream: 0.
+foo totalAudioStreams.
+foo totalVideoStreams.
+foo videoFrames: 0.
+foo videoFrameHeight: 0.
+foo videoFrameWidth: 0.
+foo seekPercentage: 0.5.
+foo getPercentage.
+foo videoSetCPUs: 1.
+foo setMMX: true.
+foo closeFile.
+
+-----------------------------------
+"Simply get the video start at 700 and run 50 frames then debug"
+"Better code is in the player, don't use this code, but it's an example"
+
+| foo x y counter fum |
+
+foo _ MPEGFile openFile: 'randomalien.mpg'.
+stream _ 0.
+counter _ 0.
+y _ foo videoFrameHeight: stream.
+x _ foo videoFrameWidth: stream.
+fum _ Form extent: x at y depth: 32.
+frames _ foo videoFrames: stream.
+foo videoSetFrame: 700 stream: stream.
+[foo endOfVideo: stream] whileFalse:
+ [foo videoReadNextFrameInto: fum bits
+ width: fum width height: fum height stream: stream.
+ fum displayOn: Display.
+ (counter _ counter + 1) == 50 ifTrue: [self halt]].
+foo closeFile.
+
+-----------------------------------
+"Play the audio"
+"There is more than one way to do this"
+"This is my first technically correct try"
+"DO not use this code, better code is in the player"
+
+| foo buffer sound soundOther |
+
+foo _ MPEGFile openFile: 'randomalien.mpg'.
+channels _ foo audioChannels: 0.
+sampleRate _ foo audioSampleRate: 0.
+totalSamples _ foo audioSamples: 0.
+buffer _ ByteArray new: 1024*1024*1.
+SoundPlayer startPlayerProcessBufferSize: 8192 rate: sampleRate stereo: true.
+
+result _ foo audioReadBuffer: buffer stream: 0 channel: 0 samples: 1024*1024//2.
+sound _ SampledSound samples:
+ (SampledSound convertBytesTo16BitSamples: buffer mostSignificantByteFirst: true)
+ samplingRate: sampleRate.
+
+result _ foo audioReReadBuffer: buffer stream: 0 channel: 1 samples: 1024*1024//2.
+soundOther _ SampledSound samples:
+ (SampledSound convertBytesTo16BitSamples: buffer mostSignificantByteFirst: true)
+ samplingRate: sampleRate.
+
+sound _ MixedSound new
+ add: sound pan: 0;
+ add: soundOther pan: 1.0.
+sound play
+
+-----------------------------------
+"Ok make it simple for Audio"
+
+| foo |
+form _ Form extent: 320 at 240 depth: 16.
+foo _ MPEGPlayer playFile: 'randomAlien.mpg' onForm: form.
+foo playAudioStreamWaitTilDone: 0.
+
+-----------------------------------
+"Ok make it simple for Video"
+| foo |
+form _ Form extent: 320 at 240 depth: 32.
+foo _ MPEGPlayer playFile: 'randomAlien.mpg' onForm: form.
+foo playVideoStreamWaitTilDone: 0.
+
+-----------------------------------
+"Play the video in the background"
+| foo |
+form _ Form extent: 320 at 240 depth: 16.
+foo _ MPEGPlayer playFile: 'randomAlien.mpg' onForm: form.
+foo playVideoStream: 0.
+foo inspect.
+
+-----------------------------------
+"Play both in the background"
+| foo |
+form _ Form extent: 320 at 240 depth: 16.
+foo _ MPEGPlayer playFile: 'randomAlien.mpg' onForm: form.
+foo playStream: 0.
+foo inspect.
+
+-------------------------
+" In Morphic do "
+| foo |
+form _ Form extent: 320 at 240 depth: 32.
+morph _ SketchMorph withForm: form.
+morph openInWorld.
+foo _ MPEGPlayer playFile: 'randomAlien.mpg' onMorph: morph.
+foo morph: morph.
+foo playStream: 0.
+foo inspect.
Modified: trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/audio/mpeg3audio.c
===================================================================
--- trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/audio/mpeg3audio.c 2011-06-09 08:29:00 UTC (rev 2413)
+++ trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/audio/mpeg3audio.c 2011-06-09 08:30:40 UTC (rev 2414)
@@ -258,7 +258,7 @@
mpeg3_t *file = (mpeg3_t *) audio->file;
mpeg3_atrack_t *track = (mpeg3_atrack_t *) audio->track;
long frame_number;
- long byte_position;
+ long byte_position = 0;
double time_position;
/* Sample seek wasn't requested */
Modified: trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/changesForSqueak.c
===================================================================
--- trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/changesForSqueak.c 2011-06-09 08:29:00 UTC (rev 2413)
+++ trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/changesForSqueak.c 2011-06-09 08:30:40 UTC (rev 2414)
@@ -6,7 +6,7 @@
* AUTHOR: John McIntosh, and others.
* ADDRESS:
* EMAIL: johnmci at smalltalkconsulting.com
-* RCSID: $Id: changesForSqueak.c,v 1.7 2003/02/08 18:23:30 johnmci Exp $
+* RCSID: $Id$
*
* 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
@@ -189,7 +189,7 @@
{
int result = 0, done = 0, counter_start, counter;
mpeg3_t *file = (mpeg3_t *) demuxer->file;
- long next_byte, prev_byte;
+ long next_byte=0, prev_byte=0;
double next_time, prev_time, absolute_time;
long i;
mpeg3_title_t *title;
Modified: trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/mpeg3demux.c
===================================================================
--- trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/mpeg3demux.c 2011-06-09 08:29:00 UTC (rev 2413)
+++ trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/mpeg3demux.c 2011-06-09 08:30:40 UTC (rev 2414)
@@ -711,15 +711,15 @@
demuxer->raw_size = demuxer->packet_size;
demuxer->raw_offset = 0;
demuxer->data_size = 0;
-
+
/* Search backward for it. */
header = mpeg3io_read_int32(title->fs);
result = mpeg3io_eof(title->fs);
if(!result) result = mpeg3io_seek_relative(title->fs, -4);
-// Search backwards for header
- while(header != MPEG3_PACK_START_CODE && !result && count < demuxer->packet_size)
+ // Search backwards for header
+ while(header != MPEG3_PACK_START_CODE && !result && count < (demuxer->packet_size))
{
result = mpeg3io_seek_relative(title->fs, -1);
if(!result)
@@ -731,21 +731,21 @@
count++;
}
- if(result)
- {
+ if ((header != MPEG3_PACK_START_CODE) || (result) ) {
// couldn't find MPEG3_PACK_START_CODE
return 1;
}
-
+
result = mpeg3io_read_data(demuxer->raw_data, demuxer->packet_size, title->fs);
-
if(result)
{
perror("mpeg3_read_program");
return 1;
}
+ // fprintf(stderr, "Got data %ld\n", title->fs->current_byte);
header = mpeg3packet_read_int32(demuxer);
+
while(demuxer->raw_offset + 4 < demuxer->raw_size && !result)
{
if(header == MPEG3_PACK_START_CODE)
@@ -887,8 +887,11 @@
/* Read packets until the output buffer is full */
if(!result)
{
+ long p1; // BGF added this protection against infinite-looping here.
do
{
+ p1 = title->fs->current_byte;
+
result = mpeg3_advance_timecode(demuxer, 0);
if(!result)
@@ -910,8 +913,15 @@
result = mpeg3io_read_data(demuxer->data_buffer, demuxer->packet_size, title->fs);
if(!result) demuxer->data_size = demuxer->packet_size;
}
+
+ // We can spin out on attempts to read the last packet over and over.
+ if (p1 >= title->fs->current_byte) {
+ result = -1;
+ title->fs->current_byte = title->fs->total_bytes; // So EOF checks start to fire.
+ fprintf(stderr, "Stopping demux-stream to prevent spin.");
+ }
}
- }while(!result && demuxer->data_size == 0 && (demuxer->do_audio || demuxer->do_video));
+ } while (!result && demuxer->data_size == 0 && (demuxer->do_audio || demuxer->do_video));
}
return result;
@@ -1046,7 +1056,7 @@
int dont_store)
{
mpeg3demux_timecode_t *new_table;
- mpeg3demux_timecode_t *new_timecode, *old_timecode;
+ mpeg3demux_timecode_t *new_timecode = NULL, *old_timecode = NULL;
long i;
if(!title->timecode_table ||
@@ -1381,7 +1391,7 @@
{
int result = 0, done = 0, counter_start, counter;
mpeg3_t *file = (mpeg3_t *) demuxer->file;
- long next_byte, prev_byte;
+ long next_byte=0, prev_byte=0;
double next_time, prev_time, absolute_time;
long i;
mpeg3_title_t *title;
Modified: trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/mpeg3io.c
===================================================================
--- trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/mpeg3io.c 2011-06-09 08:29:00 UTC (rev 2413)
+++ trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/mpeg3io.c 2011-06-09 08:30:40 UTC (rev 2414)
@@ -105,20 +105,26 @@
return fs->total_bytes;
}
+ if (! fs->fd) { // bgf error protection for win
+ return 0;
+ }
+
fseek(fs->fd, 0, SEEK_END);
fs->total_bytes = ftell(fs->fd) - fs->id3v2_offset;
fseek(fs->fd, fs->id3v2_offset, SEEK_SET);
+
return fs->total_bytes;
}
int mpeg3io_get_id3v2_size(mpeg3_fs_t *fs)
{
unsigned long synchsafe_size = 0;
-
+
if (fs->mpeg_is_in_buffer) {
fs->mpeg_is_in_buffer_file_position = 6;
} else {
- fseek(fs->fd, 6, SEEK_SET);
+ if (! fs->fd) return 0;
+ fseek(fs->fd, 6, SEEK_SET);
}
synchsafe_size = mpeg3io_read_int32(fs);
@@ -138,8 +144,7 @@
perror("mpeg3io_open_file");
return 1;
}
- setvbuf(fs->fd,0, _IOFBF, 64*1024); //JMM Feb 26th, 2006 for CD reader performance
-
+ setvbuf(fs->fd,0, _IOFBF, 64*1024); //JMM Feb 26th, 2006 for CD reader performance
}
bits = mpeg3io_read_int32(fs);
@@ -151,14 +156,15 @@
fs->id3v2_offset = 0;
}
- mpeg3io_seek(fs, 0);
-
fs->total_bytes = mpeg3io_get_total_bytes(fs);
if(!fs->total_bytes)
{
- if (!fs->mpeg_is_in_buffer)
- fclose(fs->fd);
+ if (!fs->mpeg_is_in_buffer) {
+ if (fs->fd) fclose(fs->fd);
+ }
+ fprintf(stderr, "MP2 - empty file %s\n", fs->path);
+ fs->fd = NULL;
return 1;
}
fs->current_byte = 0;
@@ -174,6 +180,7 @@
memoryFree(fs->mpeg_is_in_buffer);
fs->mpeg_is_in_buffer = 0;
}
+ /* fprintf (stderr, "MP2 closing %s\n", fs->path); */
fs->fd = 0;
return 0;
}
@@ -193,7 +200,7 @@
fs->mpeg_is_in_buffer_file_position += normalizedBytes;
result = !normalizedBytes;
} else {
- result = !fread(buffer, 1, bytes, fs->fd);
+ result = (fs->fd != NULL) && !fread(buffer, 1, bytes, fs->fd);
}
fs->current_byte += bytes;
return (result && bytes);
@@ -244,16 +251,28 @@
fs->mpeg_is_in_buffer_file_position = target;
return 0;
}
- return fseek(fs->fd, byte + fs->id3v2_offset, SEEK_SET);
+ // For Squeak-Teleplace, where we only deal in static mpeg files.
+ // No seek beyond the EOF. Partly to protect against win32 seek woes.
+ if (byte < 0) {
+ return -1;
+ } else if (fs->total_bytes && (byte > fs->total_bytes)) {
+ /* fprintf(stderr, "libmpeg3 seek out of range %ld vs %ld\n", byte, fs->total_bytes); */
+ return -1;
+ } else {
+ if (fs->fd) {
+ return fseek(fs->fd, (byte + fs->id3v2_offset), SEEK_SET);
+ }
+ fprintf(stderr, "MP2: seek no fd\n");
+ return -1;
+ }
}
int mpeg3io_seek_relative(mpeg3_fs_t *fs, long bytes)
{
+ long old_current_byte = fs->current_byte;
fs->current_byte += bytes;
if (fs->mpeg_is_in_buffer) {
- int target;
-
- target = fs->current_byte + fs->id3v2_offset;
+ long target = fs->current_byte + fs->id3v2_offset;
if (target > fs->mpeg_buffer_size)
return -1;
if (target < 0) {
@@ -261,7 +280,19 @@
fs->mpeg_is_in_buffer_file_position = target;
return 0;
}
- return fseek(fs->fd, fs->current_byte + fs->id3v2_offset, SEEK_SET);
+ if (fs->current_byte < 0) {
+ return -1;
+ } else if (fs->total_bytes && (fs->current_byte > fs->total_bytes)) {
+ /* For Squeak-Teleplace, where we only deal in static mpeg files. */
+ /* No seek beyond the EOF. Partly to protect against win32 seek woes. */
+ return -1;
+ }
+
+ if (fs->fd) {
+ return fseek(fs->fd, fs->current_byte + fs->id3v2_offset, SEEK_SET);
+ }
+ fprintf(stderr, "MP2: rel seek no fd\n");
+ return -1;
}
int mpeg3io_scanf (mpeg3_fs_t *fs,char *format, void * string1, void * string2) {
@@ -270,7 +301,10 @@
return_value = sscanf(fs->mpeg_is_in_buffer+fs->mpeg_is_in_buffer_file_position,format, string1, string2);
return return_value;
}
-
+ if (! fs->fd) {
+ fprintf(stderr, "MP2 scan3 - no file\n");
+ return -1;
+ }
return_value = fscanf(fs->fd,format, string1, string2);
return return_value;
}
@@ -282,7 +316,10 @@
return_value = sscanf(fs->mpeg_is_in_buffer+fs->mpeg_is_in_buffer_file_position,format, string1, string2, string3, string4, string5);
return return_value;
}
-
+ if (! fs->fd) {
+ fprintf(stderr, "MP2 scan5 - no file\n");
+ return -1;
+ }
return_value = fscanf(fs->fd,format, string1, string2, string3, string4, string5);
return return_value;
}
@@ -292,7 +329,7 @@
return fs->mpeg_is_in_buffer_file_position == fs->mpeg_buffer_size;
}
- return feof(fs->fd);
+ return ( ! fs->fd ) || feof(fs->fd);
}
inline int mpeg3io_fgetc(mpeg3_fs_t *fs) {
@@ -306,6 +343,6 @@
value = (unsigned int) fs->mpeg_is_in_buffer[fs->mpeg_is_in_buffer_file_position-1];
return value;
}
- return fgetc(fs->fd);
+ return (fs->fd ? fgetc(fs->fd) : 0);
}
Modified: trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/video/getpicture.c
===================================================================
--- trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/video/getpicture.c 2011-06-09 08:29:00 UTC (rev 2413)
+++ trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/video/getpicture.c 2011-06-09 08:30:40 UTC (rev 2414)
@@ -159,7 +159,7 @@
int comp,
int dc_dct_pred[])
{
- int val, i, j, sign;
+ int val, i, j=0, sign;
unsigned int code;
mpeg3_DCTtab_t *tab = 0;
short *bp = slice->block[comp];
@@ -275,7 +275,7 @@
mpeg3video_t *video,
int comp)
{
- int val, i, j, sign;
+ int val, i, j=0, sign;
unsigned int code;
mpeg3_DCTtab_t *tab;
short *bp = slice->block[comp];
@@ -374,7 +374,7 @@
int comp,
int dc_dct_pred[])
{
- int val, i, j, sign, nc;
+ int val, i, j=0, sign, nc;
unsigned int code;
mpeg3_DCTtab_t *tab;
short *bp;
@@ -502,7 +502,7 @@
mpeg3video_t *video,
int comp)
{
- int val, i, j, sign, nc;
+ int val, i, j=0, sign, nc;
unsigned int code;
mpeg3_DCTtab_t *tab;
short *bp;
Modified: trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/video/macroblocks.c
===================================================================
--- trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/video/macroblocks.c 2011-06-09 08:29:00 UTC (rev 2413)
+++ trunk/platforms/Cross/plugins/Mpeg3Plugin/libmpeg/video/macroblocks.c 2011-06-09 08:30:40 UTC (rev 2414)
@@ -82,7 +82,7 @@
static inline int mpeg3video_getsp_imb_type(mpeg3_slice_t *slice)
{
- mpeg3_slice_buffer_t *slice_buffer = slice_buffer;
+ mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
unsigned int code = mpeg3slice_showbits(slice_buffer, 4);
if(!code)
{
More information about the Vm-dev
mailing list