1 'From Squeak3.8 of ''5 May 2005'' [latest update: #6665] on 26 February 2006 at 1:12:11 pm'!
2 
3 !Mpeg3Plugin methodsFor: 'primitives' stamp: 'JMM 2/26/2006 13:02'!
4 primitiveMPEG3ReadFrame: fileHandle buffer: aBuffer bufferOffset: aBufferOffset x: xNumber y: yNumber w: width h: height ow: outWidth oh: outHeight colorModel: model stream: aNumber bytesPerRow: aByteNumber
5 	| file result outputRowsPtr bufferBaseAddr |
6 
7 	"int mpeg3_read_frame(mpeg3_t *file,
8 		unsigned char **output_rows,
9 		int in_x,
10 		int in_y,
11 		int in_w,
12 		int in_h,
13 		int out_w,
14 		int out_h,
15 		int color_model,
16 		int stream)"
17 
18 	self primitive: 'primitiveMPEG3ReadFrameBufferOffset'
19 		parameters: #(Oop WordArray  SmallInteger SmallInteger  SmallInteger  SmallInteger  SmallInteger  SmallInteger  SmallInteger  SmallInteger  SmallInteger SmallInteger).
20 	self var: #file declareC: 'mpeg3_t * file'.
21 	self var: #bufferBaseAddr declareC: 'unsigned char *bufferBaseAddr'.
22 	self var: #outputRowsPtr declareC: 'unsigned char  ** outputRowsPtr'.
23 
24 	file := self mpeg3tValueOf: fileHandle.
25 	file = nil ifTrue: [^0].
26 	aNumber < 0 ifTrue: [ interpreterProxy success: false.  ^nil ].
27 	aNumber >= (self cCode: 'result = mpeg3_total_vstreams(file)') ifTrue: [
28 		interpreterProxy success: false.  ^0 ].
29 
30 	bufferBaseAddr := self cCoerce: aBuffer to: 'unsigned char *'.
31 	self cCode: 'outputRowsPtr = (unsigned char **) memoryAllocate(1,sizeof(unsigned char*) * outHeight)'.
32 
33 	0 to: outHeight-1 do: [:i | outputRowsPtr at: i put: (bufferBaseAddr + aBufferOffset + (aByteNumber*i))].
34 
35 	self cCode: 'result = mpeg3_read_frame(file,outputRowsPtr,xNumber,yNumber,width,height,outWidth,outHeight,model,aNumber)'.
36 	self cCode: 'memoryFree(outputRowsPtr)'.
37 	^result asSmallIntegerObj
38 ! !
39 
40