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