OSErr qQuickTimeEncoderCallback(void *encodedFrameOutputRefCon, ICMCompressionSessionRef session, OSStatus error, ICMEncodedFrameRef frame, void *reserved) { QEncoder* encoder = (QEncoder*)encodedFrameOutputRefCon; QCallbackData *cbd = &(encoder->callbackData); char* buf; int frameDataSize = ICMEncodedFrameGetDataSize(frame); ICMFrameType frameType = ICMEncodedFrameGetFrameType(frame); // is this a keyframe? ImageDescriptionHandle handle; OSStatus err; long count; // XXXX DEBUGGGING: let's see if this mofo has any extensions /* err = ICMEncodedFrameGetImageDescription(frame, &handle); if (err != noErr) { fprintf(QSTDERR, "\nqQuickTimeEncoderCallback(): cannot get an image description of the frame"); fprintf(QSTDERR, "\n\tQUICKTIME ERROR CODE: %d", err); return noErr; // I don't know what the QuickTime error code should be (or how QT would interpret it) } err = CountImageDescriptionExtensionType(handle, 'avcC', &count); if (err != noErr) { fprintf(QSTDERR, "\nqQuickTimeEncoderCallback(): cannot get extension count for type 'avcC'"); fprintf(QSTDERR, "\n\tQUICKTIME ERROR CODE: %d", err); return noErr; // I don't know what the QuickTime error code should be (or how QT would interpret it) } fprintf(QSTDERR, "\ncount for extension type 'avcC': %d", count); */ int dataErr = qPrepareCallbackDataForWrite(cbd, frameDataSize+1); if (dataErr) { fprintf(QSTDERR, "\nqQuickTimeEncoderCallback: cannot get a callback buffer"); return noErr; // I don't know what the QuickTime error code should be (or how QT would interpret it) } buf = cbd->data; // QwaqMediaPlugin-V1: first byte denotes whether the frame is a keyframe or not. if (frameType == kICMFrameType_I) buf[0] = 1; // yep, that's a keyframe else buf[0] = 0; // nosirree, that ain't no keyframe //XXXX: debugging: is the frame a keyframe? //fprintf(QSTDERR, "\nkeyframe value: %d", frameType); // Store the data. memcpy(buf+1, ICMEncodedFrameGetDataPtr(frame), frameDataSize); interpreterProxy->signalSemaphoreWithIndex(encoder->semaIndex); return noErr; }
static OSStatus _frame_compressed(void *efRefCon, ICMCompressionSessionRef session, OSStatus err, ICMEncodedFrameRef ef, void *reserved) { dbg_printf("[ vOE] >> [%08lx] :: _frame_compressed()\n", (UInt32) -1); if (!err) { StreamInfoPtr si = (StreamInfoPtr) efRefCon; ImageDescriptionHandle imgDesc = NULL; ImageDescription *id; UInt32 enc_size = ICMEncodedFrameGetDataSize(ef); err = ICMEncodedFrameGetImageDescription(ef, &imgDesc); if (!err) { id = *imgDesc; dbg_printf("[ vOE] f> [%08lx] :: _frame_compressed() = %ld, '%4.4s'" " %08lx %08lx [%d x %d] [%f x %f] %ld %d %d %d\n", (UInt32) -1, err, (char *) &id->cType, id->temporalQuality, id->spatialQuality, id->width, id->height, id->hRes / 65536.0, id->vRes / 65536.0, id->dataSize, id->frameCount, id->depth, id->clutID); dbg_printf("[ vOE] fi [%08lx] :: _frame_compressed() = %lld %ld %ld\n", (UInt32) -1, ICMEncodedFrameGetDecodeDuration(ef), enc_size, ICMEncodedFrameGetBufferSize(ef)); } if (si->si_v.cs_imdsc == NULL) si->si_v.cs_imdsc = imgDesc; if (si->si_v.op_buffer_size < enc_size) { si->si_v.op_buffer = realloc(si->si_v.op_buffer, enc_size); si->si_v.op_buffer_size = enc_size; } memcpy(si->si_v.op_buffer, ICMEncodedFrameGetDataPtr(ef), enc_size); /* skip one byte (pre-padding); see TheoraEncoder.c, Theora_ImageEncoderEncodeFrame() */ si->si_v.op.packet = si->si_v.op_buffer + 1; si->si_v.op.bytes = enc_size - 1; //si->si_v.op.packetno = si->packets_total++; //si->si_v.op.granulepos = si->last_grpos++; si->si_v.op_flags = ICMEncodedFrameGetMediaSampleFlags(ef); } dbg_printf("[ vOE] < [%08lx] :: _frame_compressed() = %ld\n", (UInt32) -1, err); return err; }