日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stagefright框架(四)-Video Buffer传输流程

發布時間:2023/12/9 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stagefright框架(四)-Video Buffer传输流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這篇文章將介紹Stagefright中是如何和OMX video decoder傳送buffer


(1) OMXCodec會在一開始的時候透過read函式來傳送未解碼的datadecoder,並且要求decoder將解碼後的data傳回來


status_t OMXCodec::read(...)
{
??if?(mInitialBufferSubmit)
??{
????mInitialBufferSubmit?=?false;

????drainInputBuffers();?<----- OMX_EmptyThisBuffer
????fillOutputBuffers();?<----- OMX_FillThisBuffer
??}

??...
}

void?OMXCodec::drainInputBuffers()
{
??Vector<BufferInfo>?*buffers?=?&mPortBuffers[kPortIndexInput];

??for?(i?=?0;?i?<?buffers->size();?++i)
??{
????drainInputBuffer(&buffers->editItemAt(i));
??}
}

void?OMXCodec::drainInputBuffer(BufferInfo?*info)
{
??mOMX->emptyBuffer(...);
}

void?OMXCodec::fillOutputBuffers()
{
??Vector<BufferInfo>?*buffers?=?&mPortBuffers[kPortIndexOutput];

??for?(i?=?0;?i?<?buffers->size();?++i)
??{
????fillOutputBuffer(&buffers->editItemAt(i));
??}
}

void?OMXCodec::fillOutputBuffer(BufferInfo?*info)
{
??mOMX->fillBuffer(...);
}


(2) Decoderinput port讀取資料後,開始進行解碼,並且回傳EmptyBufferDone通知OMXCodec


void?OMXCodec::on_message(const?omx_message?&msg)
{
??switch?(msg.type)
??{
????case?omx_message::EMPTY_BUFFER_DONE:
????{
??????IOMX::buffer_id buffer?=?msg.u.extended_buffer_data.buffer;
??????drainInputBuffer(&buffers->editItemAt(i));
????}
??}
}


OMXCodec收到EMPTY_BUFFER_DONE之後,繼續傳送下一個未解碼的資料給decoder

(3) Decoder將解碼完的資料送到output port,並回傳FillBufferDone通知OMXCodec


void?OMXCodec::on_message(const?omx_message?&msg)
{
??switch?(msg.type)
??{
????case?omx_message::FILL_BUFFER_DONE:
????{
??????IOMX::buffer_id buffer?=?msg.u.extended_buffer_data.buffer;
??????fillOutputBuffer(info);

??????mFilledBuffers.push_back(i);
??????mBufferFilled.signal();
????}
??}
}


OMXCodec收到FILL_BUFFER_DONE之後,將解碼後的資料放入mFilledBuffers,發出mBufferFilled信號,並且要求decoder繼續送出資料。

(4) read函式在後段等待mBufferFilled信號。當mFilledBuffers被填入資料後,read函式將其指定給buffer指標,並回傳給AwesomePlayer


?

status_t OMXCodec::read(MediaBuffer?**buffer,?...)
{
??...

??while?(mFilledBuffers.empty())
??{
????mBufferFilled.wait(mLock);
??}

??BufferInfo?*info?=?&mPortBuffers[kPortIndexOutput].editItemAt(index);
??info->mMediaBuffer->add_ref();
??*buffer?=?info->mMediaBuffer;
}

?

轉載于:https://www.cnblogs.com/shakin/p/4097110.html

總結

以上是生活随笔為你收集整理的stagefright框架(四)-Video Buffer传输流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。