25 #include <binder/ProcessState.h>
26 #include <media/stagefright/MetaData.h>
27 #include <media/stagefright/MediaBufferGroup.h>
28 #include <media/stagefright/MediaDebug.h>
29 #include <media/stagefright/MediaDefs.h>
30 #include <media/stagefright/OMXClient.h>
31 #include <media/stagefright/OMXCodec.h>
32 #include <utils/List.h>
41 #define OMX_QCOM_COLOR_FormatYVU420SemiPlanar 0x7FA30C00
43 using namespace android;
77 std::map<int64_t, TimeStamp> *
ts_map;
94 buf_group.add_buffer(
new MediaBuffer(
frame_size));
109 virtual status_t read(MediaBuffer **
buffer,
110 const MediaSource::ReadOptions *
options) {
114 if (
s->thread_exited)
115 return ERROR_END_OF_STREAM;
118 while (
s->in_queue->empty())
121 frame = *
s->in_queue->begin();
125 ret = buf_group.acquire_buffer(buffer);
127 memcpy((*buffer)->data(), frame->
buffer, frame->
size);
128 (*buffer)->set_range(0, frame->
size);
129 (*buffer)->meta_data()->clear();
130 (*buffer)->meta_data()->setInt32(kKeyIsSyncFrame,frame->
key);
131 (*buffer)->meta_data()->setInt64(kKeyTime, frame->
time);
138 s->in_queue->erase(
s->in_queue->begin());
164 int64_t out_frame_index = 0;
177 if (frame->
status == OK) {
178 sp<MetaData> outFormat = (*s->
decoder)->getFormat();
179 outFormat->findInt32(kKeyWidth , &w);
180 outFormat->findInt32(kKeyHeight, &h);
198 (w & 15 || h & 15)) {
199 if (((w + 15)&~15) * ((h + 15)&~15) * 3/2 == buffer->range_length()) {
214 src_data[0] = (
uint8_t*)buffer->data();
215 src_data[1] = src_data[0] + src_linesize[0] * h;
216 src_data[2] = src_data[1] + src_linesize[1] * -(-h>>pix_desc->log2_chroma_h);
218 src_data, src_linesize,
221 buffer->meta_data()->findInt64(kKeyTime, &out_frame_index);
222 if (out_frame_index && s->
ts_map->count(out_frame_index) > 0) {
225 s->
ts_map->erase(out_frame_index);
228 }
else if (frame->
status == INFO_FORMAT_CHANGED) {
258 sp<MetaData> meta, outFormat;
286 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
287 meta->setInt32(kKeyWidth, avctx->
width);
288 meta->setInt32(kKeyHeight, avctx->
height);
291 android::ProcessState::self()->startThreadPool();
293 s->
source =
new sp<MediaSource>();
297 s->
ts_map =
new std::map<int64_t, TimeStamp>;
298 s->
client =
new OMXClient;
306 if (s->
client->connect() != OK) {
312 s->
decoder =
new sp<MediaSource>();
315 OMXCodec::kClientNeedsFramebuffer);
316 if ((*s->
decoder)->start() != OK) {
323 outFormat = (*s->
decoder)->getFormat();
324 outFormat->findInt32(kKeyColorFormat, &colorFormat);
326 colorFormat == OMX_COLOR_FormatYUV420SemiPlanar)
328 else if (colorFormat == OMX_COLOR_FormatYCbYCr)
330 else if (colorFormat == OMX_COLOR_FormatCbYCrY)
361 int orig_size = avpkt->
size;
370 if (avpkt && avpkt->
data) {
391 if (!
frame->buffer) {
399 frame->size = orig_size;
401 memcpy(
frame->buffer, ptr, orig_size);
409 frame->status = ERROR_END_OF_STREAM;
446 ret_frame =
frame->vframe;
447 status =
frame->status;
450 if (status == ERROR_END_OF_STREAM)
485 avctx->release_buffer(avctx,
frame->vframe);
537 avctx->release_buffer(avctx,
frame->vframe);
573 "libstagefright_h264",