示例#1
0
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 ();
}
示例#2
0
文件: mp3.cpp 项目: kangaroo/moon
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 ();
}