Firefly开源社区

123
发表新贴
打印 上一主题 下一主题

android下mjpeg格式硬解码

26

积分

0

威望

0

贡献

技术小白

积分
26
发表于 2017-5-15 18:21:21        只看该作者  11#
你好,MJPEG硬解码的问题解决了么?
回复

使用道具 举报

26

积分

0

威望

0

贡献

技术小白

积分
26
发表于 2017-5-16 17:48:11        只看该作者  12#
有没有人在啊
回复

使用道具 举报

44

积分

0

威望

0

贡献

技术小白

积分
44
发表于 2018-6-21 17:50:29        只看该作者  13#
用硬解实现了,但发现效率不高啊,memcpy也比较消耗时间
回复

使用道具 举报

38

积分

0

威望

0

贡献

游客

积分
38
发表于 2018-7-11 20:32:21        只看该作者  14#
insighters 发表于 2018-6-21 17:50
用硬解实现了,但发现效率不高啊,memcpy也比较消耗时间

我的3288 android 5.1.1用jpeg编解码库是libjpeghwdec.so和libjpeghwenc.so。请问你那边是什么?
回复

使用道具 举报

38

积分

0

威望

0

贡献

游客

积分
38
发表于 2018-7-11 20:32:52        只看该作者  15#
insighters 发表于 2018-6-21 17:50
用硬解实现了,但发现效率不高啊,memcpy也比较消耗时间

我的3288 android 5.1.1用jpeg编解码库是jpeghwdec和jpeghwenc。请问你那边是什么?
回复

使用道具 举报

38

积分

0

威望

0

贡献

游客

积分
38
发表于 2018-7-11 20:33:41        只看该作者  16#
insighters 发表于 2018-6-21 17:50
用硬解实现了,但发现效率不高啊,memcpy也比较消耗时间

我的3288 android 5.1.1用jpeg编解码库是什么?
回复

使用道具 举报

38

积分

0

威望

0

贡献

游客

积分
38
发表于 2018-7-12 14:57:29        只看该作者  17#
insighters 发表于 2018-6-21 17:50
用硬解实现了,但发现效率不高啊,memcpy也比较消耗时间

你好,请问有参考demo吗?
回复

使用道具 举报

96

积分

0

威望

0

贡献

技术小白

积分
96
发表于 2018-7-13 16:25:22        只看该作者  18#
insighters 发表于 2018-6-21 17:50
用硬解实现了,但发现效率不高啊,memcpy也比较消耗时间

大牛,有参考的demo吗,小弟这边也想用vpu 硬解JPEG,求分享
回复

使用道具 举报

44

积分

0

威望

0

贡献

技术小白

积分
44
发表于 2018-10-18 16:02:14        只看该作者  19#
附件需要在android目录下编译,生成的so可以在ndk使用,支持yuyv/nv12/rgba3种格式

external/skia也需要略作修改
diff --git a/include/core/SkStream.h b/include/core/SkStream.h
index 43c3c8c..eb504bb 100755
--- a/include/core/SkStream.h
+++ b/include/core/SkStream.h
@@ -351,6 +351,7 @@ public:
     virtual size_t getLength() const SK_OVERRIDE;

     virtual const void* getMemoryBase() SK_OVERRIDE;
+       virtual bool markSupport() SK_OVERRIDE;

private:
     SkData* fData;
diff --git a/src/core/SkStream.cpp b/src/core/SkStream.cpp
index ceb30d5..2972343 100755
--- a/src/core/SkStream.cpp
+++ b/src/core/SkStream.cpp
@@ -314,6 +314,7 @@ static SkData* newFromParams(const void* src, size_t size, bool copyData) {
     }
}

+
SkMemoryStream::SkMemoryStream() {
     fData = SkData::NewEmpty();
     fOffset = 0;
@@ -343,6 +344,12 @@ SkMemoryStream::~SkMemoryStream() {
     fData->unref();
}

+bool SkMemoryStream::markSupport(){
+    //for show whether support reset() or mark() in java, add by WH
+    return true;
+}
+
+
void SkMemoryStream::setMemoryOwned(const void* src, size_t size) {
     fData->unref();
     fData = SkData::NewFromMalloc(src, size);
diff --git a/src/images/SkHwJpegUtility.cpp b/src/images/SkHwJpegUtility.cpp
index 9c7b434..5e9c5ae 100755
--- a/src/images/SkHwJpegUtility.cpp
+++ b/src/images/SkHwJpegUtility.cpp
@@ -13,13 +13,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+//#define DEBUG_HW_JPEG
#include "SkHwJpegUtility.h"
#include "SkCanvas.h"
#ifdef DEBUG_HW_JPEG
#include "utils/Log.h"
#undef LOG_TAG
#define LOG_TAG "SkHwJpegUtility"
-#define WHLOG LOGE
+#define WHLOG ALOGD
+#define WHREDLOG ALOGE
#endif

/////////////////////////////////////////////////////////////////////
@@ -514,6 +517,7 @@ SkJpegVPUMemStream::SkJpegVPUMemStream(SkStream * stream, size_t *len){
        hw_jpeg_VPUMallocLinear(&vpuMem, mallocSize);
        if(vpuMem.vir_addr != NULL)
        {
+               WHLOG("SkJpegVPUMemStream virtual addr: %p ", vpuMem.vir_addr);
                stream->rewind();
                bool readApp1 = false, readApp0 = false, readSof = false, error = false;
                unsigned short twoBytes = 0;
@@ -524,7 +528,7 @@ SkJpegVPUMemStream::SkJpegVPUMemStream(SkStream * stream, size_t *len){
                                break;
                        }
                        size_t readBytes = stream->read(&twoBytes,2);//FIX ME if big edian
-                       WHLOG("meet mark : 0x%x, readBytes: %d", twoBytes, readBytes);
+                       WHLOG("meet mark : 0x%x, readBytes: %d, bytesInStream:%d", twoBytes, readBytes, bytesInStream);
                        error = (readBytes<=0);
                        if(error){
                                break;
@@ -533,6 +537,10 @@ SkJpegVPUMemStream::SkJpegVPUMemStream(SkStream * stream, size_t *len){
                        memcpy(mem, &twoBytes, sizeof(unsigned short));
                        mem += readBytes;
                        switch(twoBytes){
+                               case 0xDAFF:
+                                       readApp1 = true;
+                                       readApp0 = true;
+                                       break;
                                case 0xD9FF://EOI
                                        readApp1 = true;
                                        readApp0 = true;
@@ -546,6 +554,8 @@ SkJpegVPUMemStream::SkJpegVPUMemStream(SkStream * stream, size_t *len){
                                case 0xC2FF://SOF2
                                        if(twoBytes == 0xC0FF || twoBytes == 0xC2FF){
                                                readSof = true;
+                                               //fix error
+                                               //readApp0 = true;
                                        } else if(twoBytes == 0xE0FF){
                                                readApp0 = true;
                                        }else if(twoBytes == 0xE1FF){
diff --git a/src/images/SkImageDecoder_libjpeg.cpp b/src/images/SkImageDecoder_libjpeg.cpp
index 003a77e..a8513c1 100755
--- a/src/images/SkImageDecoder_libjpeg.cpp
+++ b/src/images/SkImageDecoder_libjpeg.cpp
@@ -30,7 +30,9 @@ extern "C" {
     #include "jerror.h"
}

-//#define HW_JPEG_DEBUG
+//extern "C" void *memcpy_kernel(void *dest, const void *src, size_t n);
+
+#define HW_JPEG_DEBUG
#ifdef HW_JPEG_DEBUG
#define HW_DEBUG SkDebugf
#else
@@ -596,6 +598,7 @@ do{
                if (SkImageDecoder::kDecodeBounds_Mode != mode) {
                //use hardvpu mem sometimes when it is not decodeBounds_Mode
                        bool markSupport = stream->markSupport();
+                       //markSupport = true;
                        WHLOG("markSupport: %d", markSupport);
                        if(markSupport){//only markSupport and not justcalwh
#ifdef WH_DEBUG_JPEG
@@ -613,6 +616,7 @@ do{
                            goto __SOFT_DEC;
                        }
                }
+
                HwJpegInputInfo hwInfo;
                HwJpegOutputInfo outInfo;
                hwInfo.justcaloutwh = SkImageDecoder::kDecodeBounds_Mode != mode? 0:1;
@@ -650,6 +654,8 @@ do{
                if(reuseBitmap > 0 && colorType != bm->colorType()){
                        HW_DEBUG("bitmap is not null, but its config is not according with require.");
                }
+
+               HW_DEBUG("bitmap width:%d, height:%d, rowptr:%p", bm->width(), bm->height(), rowptr);
                if(hw_jpeg_decode(&hwInfo,&outInfo, &reuseBitmap, bm->width(), bm->height()) >= 0){
                        if(reuseBitmap < 0){
                            HW_DEBUG("REUSE BITMAP FAILED.");
@@ -680,9 +686,10 @@ do{
                                JSAMPLE * rowptr = (JSAMPLE*)bm->getPixels();
                                char *srcAddr = outInfo.outAddr;
                                HW_DEBUG("bpr: %d, rowptr: %x, srcAddr: %x, reuseBitmap: %d\n",bpr, rowptr, srcAddr, reuseBitmap);
-                               WHLOG("bpr: %d, rowptr: %x, srcAddr: %x",bpr, rowptr, srcAddr);
+                               HW_DEBUG("bpr: %d, rowptr: %x, srcAddr: %x, ppscale width:%d\n",bpr, rowptr, srcAddr);         
                                while(height < outInfo.outHeight){
                                        memcpy(rowptr, srcAddr, bpr);
+                                       //memcpy_kernel(rowptr, srcAddr, bpr);
                                        rowptr += bpr;
                                        srcAddr += outInfo.ppscalew * pixelBytes;
                                        height++;


jpegHwDecode.zip

2.29 KB, 下载次数: 37, 下载积分: 灯泡 -1 , 经验 -1

回复

使用道具 举报

44

积分

0

威望

0

贡献

技术小白

积分
44
发表于 2018-10-18 16:06:19        只看该作者  20#
使用示例   
bool ret = JpegHwDecoder::decode((char *) jpeg->data, jpeg->data_bytes, (char *) rgba->data,
                                      JpegHwDecoder::RGBA, &width, &height, false);
                                      JpegHwDecoder::RGBA, &width, &height, false);
回复

使用道具 举报

返回列表
123
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表