static void VDADecoderCallback (void *decompressionOutputRefCon, CFDictionaryRef frameInfo, OSStatus status, uint32_t infoFlags, CVImageBufferRef imageBuffer) { MoonVDADecoder *decoder = (MoonVDADecoder *) decompressionOutputRefCon; VideoStream *vs = (VideoStream *) decoder->GetStream (); // FIXME: Is this always 1 thread? Can we optimize this decoder->GetDeployment ()->RegisterThread (); Deployment::SetCurrent (decoder->GetDeployment ()); if (imageBuffer == NULL) { return; } OSType format_type = CVPixelBufferGetPixelFormatType (imageBuffer); if (format_type != kCVPixelFormatType_422YpCbCr8) { g_warning ("Mismatched format in VDA"); return; } MediaFrame *mf = (MediaFrame *) CFDictionaryGetValue (frameInfo, CFSTR ("MoonMediaFrame")); mf->AddState (MediaFrameVUY2); mf->FreeBuffer (); mf->SetBufLen (0); mf->srcSlideY = 0; mf->srcSlideH = vs->GetHeight (); mf->width = vs->GetWidth (); mf->height = vs->GetHeight (); CVPixelBufferLockBaseAddress (imageBuffer, 0); mf->data_stride [0] = (uint8_t *) CVPixelBufferGetBaseAddress (imageBuffer); mf->srcStride [0] = CVPixelBufferGetBytesPerRow (imageBuffer); mf->AddState (MediaFrameDecoded); mf->decoder_specific_data = imageBuffer; CVPixelBufferRetain (imageBuffer); decoder->ReportDecodeFrameCompleted (mf); mf->unref (); }
void Mp3FrameReader::ReadFrame () { MpegFrameHeader mpeg; guint64 duration; guint32 len; MediaFrame *frame; MemoryBuffer *current_source = demuxer->GetCurrentSource (); guint64 start_position = current_source->GetPosition (); if (!FindMpegHeader (&mpeg, NULL, current_source)) { LOG_MP3 ("Mp3FrameReader::ReadFrame (): Not enough data (mpeg header not found or not enough data for entire frame) - requesting more\n"); if (!demuxer->RequestMoreData (ReadFrameCallback)) { /* No more data */ LOG_MP3 ("Mp3FrameReader::ReadFrame (): reached end of stream.\n"); demuxer->ReportGetFrameCompleted (NULL); } return; } //printf ("Mp3FrameReader::ReadFrame():\n"); //mpeg_print_info (&mpeg); if (mpeg.bit_rate == 0) { // use the most recently specified bit rate mpeg.bit_rate = bit_rate; } bit_rate = mpeg.bit_rate; duration = mpeg_frame_duration (&mpeg); AddFrameIndex (demuxer->GetCurrentPosition () + current_source->GetPosition (), cur_pts, duration, bit_rate); len = (guint32) mpeg_frame_length (&mpeg); /* Check if we have enough data */ if (current_source->GetRemainingSize () < len) { /* We need to seek back to where we started reading this frame so that the next time we're called * we start parsing from the beginning again */ current_source->SeekSet (start_position); if (!demuxer->RequestMoreData (ReadFrameCallback, MAX (len, 1024))) { /* No more data */ demuxer->ReportGetFrameCompleted (NULL); return; } return; } frame = new MediaFrame (stream); if (!frame->AllocateBuffer (len)) { frame->unref (); return; } if (!current_source->Read (frame->GetBuffer (), len)) { /* This shouldn't happen, we've already checked that we have enough data */ demuxer->ReportErrorOccurred ("Mp3Demuxer could not read from stream."); frame->unref (); return; } frame->pts = cur_pts; frame->duration = duration; frame->AddState (MediaFrameDemuxed); cur_pts += duration; demuxer->ReportGetFrameCompleted (frame); frame->unref (); }