예제 #1
0
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;
}
예제 #2
0
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;
}