Toybrick

楼主: jefferyzhang

RK3399Pro入门教程(6)硬件编解码器MPP库的使用

 

15992605143

中级会员

积分
303
81#
发表于 2019-10-18 14:43:13 | 只看该作者
MPP_DEC_SET_IMMEDIATE_OUT: (仅限解码)
立即输出模式(不建议开启),如果未开立即输出模式,MPP会按预先设定的节奏间隔输出解码的帧(例如33ms输出一帧)
请问这个33ms的时间间隔是如何设置的?
回复

使用道具 举报

jefferyzhang

版主

积分
13574
82#
 楼主| 发表于 2019-10-18 15:06:55 | 只看该作者
shopping 发表于 2019-10-8 14:17
你好,按您的说法,不用MPP库而直接用V4L2框架解码,速度上二者差异大不大,您有试验过吗?目前我VAL2+RGA ...

请搞清楚你数据源的数据格式是什么。
V4L2和MPP没有任何关系。
回复

使用道具 举报

shopping

中级会员

积分
410
83#
发表于 2019-10-18 15:11:57 | 只看该作者
jefferyzhang 发表于 2019-10-18 15:06
请搞清楚你数据源的数据格式是什么。
V4L2和MPP没有任何关系。

这是以前没有了解时候问的,见笑了。
回复

使用道具 举报

jefferyzhang

版主

积分
13574
84#
 楼主| 发表于 2019-10-18 15:19:53 | 只看该作者
15992605143 发表于 2019-10-18 14:43
MPP_DEC_SET_IMMEDIATE_OUT: (仅限解码)
立即输出模式(不建议开启),如果未开立即输出模式,MPP会按预 ...

这个是mpp内部sleep的。按照pps sps的帧率算的
回复

使用道具 举报

jefferyzhang

版主

积分
13574
85#
 楼主| 发表于 2019-10-18 15:20:29 | 只看该作者
shopping 发表于 2019-10-18 15:11
这是以前没有了解时候问的,见笑了。

哦,以前看漏了,现在才看到这问题。
以后有问题还是单独发帖子问比较好
回复

使用道具 举报

swlmx

注册会员

积分
195
86#
发表于 2019-10-24 13:50:36 | 只看该作者
jefferyzhang 发表于 2019-5-17 11:05
mpp的build目录里有安卓编译。
我们的android也是自带libmpp的,无需编译。
android的media_codec默认就 ...

楼主,我现在想解码 Mjpeg,但是 mediacodec api 好像不支持 video/mjpeg。
应用层又无法通过 System.loadLibrary() 载入 libmpp (报错 E/linker: library "/vendor/lib/libmpp.so" ("/vendor/lib/libmpp.so") needed or dlopened by "/system/lib/libnativeloader.so" is not accessible for the namespace)。看起来android N开始应用层无法载入系统私有库。
所以要怎么测试解码mjpeg?
回复

使用道具 举报

jefferyzhang

版主

积分
13574
87#
 楼主| 发表于 2019-10-24 18:04:41 | 只看该作者
swlmx 发表于 2019-10-24 13:50
楼主,我现在想解码 Mjpeg,但是 mediacodec api 好像不支持 video/mjpeg。
应用层又无法通过 System.loa ...

可以直接用安卓jpeg loader来读,底层我记得是对接过硬件的(大于多少像素会用VPU解),具体我也不是很清楚该版本有没有。
当然不放心的话直接调用mpp来做路径是最短的
回复

使用道具 举报

swlmx

注册会员

积分
195
88#
发表于 2019-10-30 11:20:52 | 只看该作者
jefferyzhang 发表于 2019-10-24 18:04
可以直接用安卓jpeg loader来读,底层我记得是对接过硬件的(大于多少像素会用VPU解),具体我也不是很清 ...

libmpp.so是armv7的?1.3固件。
我用v8a的库链接报错
回复

使用道具 举报

jefferyzhang

版主

积分
13574
89#
 楼主| 发表于 2019-10-30 11:43:28 | 只看该作者
swlmx 发表于 2019-10-30 11:20
libmpp.so是armv7的?1.3固件。
我用v8a的库链接报错

toybrick里带的都是64bit的
回复

使用道具 举报

swlmx

注册会员

积分
195
90#
发表于 2019-11-5 10:40:22 | 只看该作者
jefferyzhang 发表于 2019-10-30 11:43
toybrick里带的都是64bit的

我yuv编码jpeg出现 jpege_api: jpege: hardware return error status 40 。存下来的图底部是花的,是哪里出了问题?代码如下

  1. void doCodec(){
  2.     MppCtx ctx;
  3.     MppApi *mpi;
  4.     MpiCmd cmd = MPP_SET_OUTPUT_BLOCK;
  5.     MppParam param      = NULL;
  6.     MppPollType block   = MPP_POLL_BLOCK;
  7.     MppCodingType type = MPP_VIDEO_CodingMJPEG;
  8.     int MPI_ENC_LOOP_COUNT = 1;
  9.     __android_log_print(ANDROID_LOG_DEBUG, "JNI","mpp_create");

  10.     if(MPP_OK != mpp_create(&ctx, &mpi)){
  11.         __android_log_print(ANDROID_LOG_DEBUG, "JNI","mpp_create failed");
  12.         goto MPP_TEST_FAILED;
  13.     }
  14.     __android_log_print(ANDROID_LOG_DEBUG, "JNI","mpp_init");

  15.     if(MPP_OK != mpp_init(ctx, MPP_CTX_ENC, type)){
  16.         __android_log_print(ANDROID_LOG_DEBUG, "JNI","mpp_init failed");
  17.         goto MPP_TEST_FAILED;
  18.     }

  19.     MppEncRcCfg rcCfg;


  20.     __android_log_print(ANDROID_LOG_DEBUG, "JNI","rcCfg");

  21.     rcCfg.change = MPP_ENC_RC_CFG_CHANGE_ALL;
  22.     rcCfg.rc_mode = (MppEncRcMode) MPP_ENC_RC_MODE_CBR;
  23.     rcCfg.quality = (MppEncRcQuality)MPP_ENC_RC_QUALITY_BEST;
  24.     rcCfg.bps_target = bps;
  25.     rcCfg.bps_max = bps * 17 / 16;
  26.     rcCfg.bps_min = bps * 15 / 16;
  27.     rcCfg.fps_in_flex      = 0;
  28.     rcCfg.fps_in_num       = 24;
  29.     rcCfg.fps_in_denorm    = 1;
  30.     rcCfg.fps_out_flex     = 0;
  31.     rcCfg.fps_out_num      = 24;
  32.     rcCfg.fps_out_denorm   = 1;
  33.     rcCfg.gop = 50;
  34.     if(MPP_OK != mpi->control(ctx, MPP_ENC_SET_RC_CFG, &rcCfg)){
  35.         __android_log_print(ANDROID_LOG_DEBUG, "JNI","rcCfg failed");
  36.         goto MPP_TEST_FAILED;
  37.     }

  38.     __android_log_print(ANDROID_LOG_DEBUG, "JNI","prepCfg");

  39.     MppEncPrepCfg prepCfg;
  40.     prepCfg.change = MPP_ENC_PREP_CFG_CHANGE_INPUT | MPP_ENC_PREP_CFG_CHANGE_FORMAT;
  41.     prepCfg.width = 1920;
  42.     prepCfg.height = YUV_HEIGHT;
  43.     prepCfg.hor_stride = MPP_ALIGN(1920, 8);
  44.     prepCfg.ver_stride = MPP_ALIGN(YUV_HEIGHT, 8);
  45.     prepCfg.format = MPP_FMT_YUV420P;

  46.     if(MPP_OK != mpi->control(ctx, MPP_ENC_SET_PREP_CFG, &prepCfg)){
  47.         __android_log_print(ANDROID_LOG_DEBUG, "JNI","rcCfg failed");
  48.         goto MPP_TEST_FAILED;
  49.     }
  50.    
  51.     __android_log_print(ANDROID_LOG_DEBUG, "JNI","codecCfg");
  52.     MppEncCodecCfg codecCfg;


  53.     if(MPP_OK != mpi->control(ctx, MPP_ENC_SET_CODEC_CFG, &codecCfg)){
  54.         __android_log_print(ANDROID_LOG_DEBUG, "JNI","codecCfg failed");
  55.         goto MPP_TEST_FAILED;
  56.     }
  57.    

  58.     MppPacket enc_out;
  59.     MppFrame enc_in;

  60.     param = █

  61.     MppBuffer frm_buf;
  62.     unsigned char *buf2;
  63.     mpp_buffer_get(NULL, &frm_buf, MPP_ALIGN(1920, 8) * MPP_ALIGN(YUV_HEIGHT, 8) * 3 / 2);


  64.     FILE *file;
  65.     file = fopen("/sdcard/single_frame.yuv", "rb");
  66.     buf2 = (unsigned char *)malloc(YUV_SIZE);
  67.     memset(buf2, 0, YUV_SIZE);

  68.     fread(buf2, 1, YUV_SIZE, file);



  69.     if(MPP_OK != mpi->control(ctx, MPP_SET_OUTPUT_BLOCK, param)){
  70.         __android_log_print(ANDROID_LOG_DEBUG, "JNI","control failed");
  71.         goto MPP_TEST_FAILED;
  72.     }

  73.     // interface with both input and output
  74.     for (int i = 0; i < MPI_ENC_LOOP_COUNT; i++) {
  75.         unsigned char *buf;
  76.         buf = (unsigned char *)mpp_buffer_get_ptr(frm_buf);


  77.         memcpy(buf, buf2, YUV_SIZE);


  78.         mpp_frame_init(&enc_in);


  79.         mpp_frame_set_width(enc_in, 1920);
  80.         mpp_frame_set_height(enc_in, YUV_HEIGHT);
  81.         mpp_frame_set_hor_stride(enc_in, MPP_ALIGN(1920, 8));
  82.         mpp_frame_set_ver_stride(enc_in, MPP_ALIGN(YUV_HEIGHT, 8));
  83.         mpp_frame_set_fmt(enc_in, MPP_FMT_YUV420P);
  84.         mpp_frame_set_buffer(enc_in, frm_buf);
  85.         mpp_frame_set_eos(enc_in, 0);





  86.         if (MPP_OK != mpi->encode_put_frame(ctx, enc_in)) {
  87.             __android_log_print(ANDROID_LOG_DEBUG, "JNI","encode_put_frame failed");
  88.             goto MPP_TEST_FAILED;
  89.         } else{

  90.             if (MPP_OK != mpi->encode_get_packet(ctx, &enc_out)) {
  91.                 __android_log_print(ANDROID_LOG_DEBUG, "JNI","encode_get_packet failed");
  92.                 goto MPP_TEST_FAILED;
  93.             } else{
  94.                 if(enc_out){
  95.                     __android_log_print(ANDROID_LOG_DEBUG, "JNI","enc_out!");
  96.                     void *ptr   = mpp_packet_get_pos(enc_out);
  97.                     size_t len  = mpp_packet_get_length(enc_out);
  98.                     RK_U32 eos = mpp_packet_get_eos(enc_out);
  99.                     unsigned char* out_buf = new unsigned char[len];
  100.                     memcpy(out_buf, ptr, len);

  101.                     FILE *outfile = fopen("/sdcard/output.jpeg", "wb+");
  102.                     fwrite(out_buf, 1, len, outfile);
  103.                     fclose(outfile);

  104.                     mpp_packet_deinit(&enc_out);
  105.                 }
  106.             }
  107.         }

  108.         mpp_frame_deinit(&enc_in);
  109.     }

  110.     mpi->reset(ctx);

  111.     if (enc_in){
  112.         mpp_frame_deinit(&enc_in);

  113.     }

  114.     mpp_destroy(ctx);
  115.     free(buf2);

  116.     __android_log_print(ANDROID_LOG_DEBUG, "JNI","mpi_test success");


  117.     return;

  118.     MPP_TEST_FAILED:

  119.     if (enc_in){
  120.         mpp_frame_deinit(&enc_in);
  121.     }
  122.     if (ctx){
  123.         mpp_destroy(ctx);
  124.     }
  125.     if (buf2){
  126.         free(buf2);
  127.     }


  128. }
复制代码
回复

使用道具 举报

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

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表