当前位置:   article > 正文

RK3568 应用层 libhwjpeg.so 硬件编解码的使用_rk mhwjpegdecoder

rk mhwjpegdecoder

        libhwjpeg是RK封装的一个对MJPEG数据进行硬件编解码的so,用起来还是比较方便,相比软编效率也有提升。应用层没有提供接口,所以需要自己封装JNI接口。在SDK/hardware/rockchip/libhwjpeg/test 下有提供硬件编解码的demo,直接照搬过来用即可。以下是我封装的JNI接口
        硬解 

  1. extern "C"
  2. JNIEXPORT jbyteArray JNICALL
  3. Java_com_wirelessmedia_eserver_remotecamera_camerafusion_HwjpegUtil_decodeFrame(JNIEnv *env,jobject thiz,jbyteArray data,jint size) {
  4. MpiJpegDecoder *pDecoder = new MpiJpegDecoder();//创建解码器
  5. /*准备参数,这里RK默认输出的是NV12的数据,询问过RK,对于YUV420 目前输出也只支持
  6. NV12,如果需要其他格式的可以通过librga进行转换
  7. */
  8. bool ret =pDecoder->prepareDecoder();
  9. if(!ret) return nullptr;
  10. jbyte *src_data= env->GetByteArrayElements(data, 0); //应用层传递的jpeg buf
  11. MpiJpegDecoder::OutputFrame_t frameOut;
  12. memset(&frameOut, 0, sizeof(MpiJpegDecoder::OutputFrame_t));
  13. ret = pDecoder->decodePacket((char *)src_data, size, &frameOut);//解码 size为jpeg的buf长度
  14. if(!ret) return nullptr;
  15. LOGD("width = %d,height = %d",frameOut.DisplayWidth,frameOut.DisplayHeight);
  16. /*
  17. frameOut.MemVirAddr 为解码后的 char*数组 test demo中有介绍
  18. */
  19. int len = frameOut.DisplayWidth*frameOut.DisplayHeight*3/2;
  20. jbyteArray jbyteArray = env->NewByteArray(len);//申明数组,与char字符长度一致
  21. env->SetByteArrayRegion(jbyteArray, 0, len, (jbyte *) frameOut.MemVirAddr);
  22. pDecoder->deinitOutputFrame(&frameOut);
  23. return jbyteArray ;
  24. }

        硬编
        

  1. extern "C"
  2. JNIEXPORT jbyteArray JNICALL
  3. Java_com_wirelessmedia_eserver_remotecamera_camerafusion_HwjpegUtil_encodeFrame(JNIEnv *env,jobject thiz,jbyteArray data,jint width,jint height) {
  4. MpiJpegEncoder *pEncoder = new MpiJpegEncoder(); //创建编码器
  5. bool ret = pEncoder->prepareEncoder(); //准备编码器
  6. if(!ret){
  7. LOGD("prepareEncoder fail");
  8. return nullptr;
  9. }
  10. //设置参数 这里的输入格式是比较多可以选
  11. /*
  12. typedef enum {
  13. INPUT_FMT_YUV420SP = MPP_FMT_YUV420SP,
  14. INPUT_FMT_YUV420P = MPP_FMT_YUV420P,
  15. INPUT_FMT_YUV422SP_VU = MPP_FMT_YUV422SP_VU,
  16. INPUT_FMT_YUV422_YUYV = MPP_FMT_YUV422_YUYV,
  17. INPUT_FMT_YUV422_UYVY = MPP_FMT_YUV422_UYVY,
  18. INPUT_FMT_ARGB8888 = MPP_FMT_ARGB8888,
  19. INPUT_FMT_RGBA8888 = MPP_FMT_RGBA8888,
  20. INPUT_FMT_ABGR8888 = MPP_FMT_ABGR8888
  21. } InputFormat;
  22. */
  23. ret = pEncoder->updateEncodeCfg(width, height, MpiJpegEncoder::INPUT_FMT_YUV420SP);
  24. if(!ret){
  25. LOGD("updateEncodeCfgfail");
  26. return nullptr;
  27. }
  28. jbyte *src_data= env->GetByteArrayElements(data, 0);//传进来的yuv数据
  29. MpiJpegEncoder::OutputPacket_t pktOut;
  30. memset(&pktOut, 0, sizeof(MpiJpegEncoder::OutputPacket_t));
  31. ret = pEncoder->encodeFrame((char *) src_data, &pktOut); //编码
  32. if(!ret){
  33. return nullptr;
  34. }
  35. //pktOut.size 是编码后的长度 pktOut.data 编码后的buf 数组
  36. jbyteArray jbyteArray = env->NewByteArray(pktOut.size);//申明数组,与char字符长度一致
  37. env->SetByteArrayRegion(jbyteArray, 0, pktOut.size, (jbyte *) pktOut.data);
  38. pEncoder->deinitOutputPacket(&pktOut);
  39. return jbyteArray;
  40. }

因为整个项目有些涉及到的不仅仅是编码解码,还涉及到很多格式转换,多个摄像头数据的叠加,融合,拼接 缩放等等,如果有小伙伴刚好也是做类似功能,有什么疑问,或者有什么想法我们可以私信交流下~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/309203
推荐阅读
相关标签
  

闽ICP备14008679号