打开
setDataSource_l(uri)
{
mUri = uri;
}
准备
prepare_l()
{
onPrepareAsyncEvent();
}
onPrepareAsyncEvent()
{
DataSource dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders);
{
source = new FileSource(uri + 7);
}
extractor = MediaExtractor::Create(
dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str());
{
ret = new MPEG4Extractor(source);
}
source->sniff(&tmp, &confidence, &meta);
{
*mimeType = MEDIA_MIMETYPE_CONTAINER_MPEG4;
*confidence = 0.4f;
}
status_t err = setDataSource_l(extractor);
{
setVideoSource(extractor->getTrack(i));
{
mVideoTrack = source; MPEG4Source
}
getTrack();
{
return new MPEG4Source(
track->meta, mDataSource, track->timescale, track->sampleTable);
mDataSoruce=FileSource;
}
}
initVideoDecoder();
initAudioDecoder();
finishAsyncPrepare_l();
}
initVideoDecoder()
{
mVideoSource = OMXCodec::Create(
mClient.interface(), mVideoTrack->getFormat(),
false, // createEncoder
mVideoTrack,
NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL);
{
sp<OMXCodec> codec = new OMXCodec(
omx, node, quirks, flags,
createEncoder, mime, componentName,
source, nativeWindow);
{
mOMX(omx);
mSource(source); mVideoTrack;
}
}
mVideoSource = codec;
mVideoSource ->start(); è OMXCodec::start
}
OMXCodec::start()
{
mSource->start(params.get());=>MPEG4Source::start
{
mGroup = new MediaBufferGroup;
mGroup->add_buffer(new MediaBuffer(max_size));
mSrcBuffer = new uint8_t[max_size];
}
Init()
{
mOMX->sendCommand(mNode, OMX_CommandStateSet, OMX_StateIdle);
err = allocateBuffers();
}
}
播放
Playe_l
{
postVideoEvent_l();
onVideoEvent();
mVideoSource->read(&mVideoBuffer, &options);
}
OMXCodec::read()
{
Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput];
drainInputBuffer();
err = mSource->read(&srcBuffer, &options);
{
num_bytes_read = mDataSource->readAt(offset, mSrcBuffer, size);
}
}