Esempio n. 1
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;
}
Esempio n. 2
0
static OSStatus FrameOutputCallback(void* encodedFrameOutputRefCon, 
    ICMCompressionSessionRef session, OSStatus error, ICMEncodedFrameRef frame,
    void* reserved)
{
    if (error)
        log_debug("quicktime_video: error encoding frame!");
    else {
        if (ICMEncodedFrameGetDecodeDuration(frame) > 0) {
             //  Adds sample data and description from an encoded frame to a media.
             OSErr theError = AddMediaSampleFromEncodedFrame(videoMedia, frame, NULL);
             if (theError)
                 log_debug("quicktime_video: error adding media sample!");
         }
    }
    return error;
}