Toybrick

楼主: jefferyzhang

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

zhouzhouzlove

中级会员

积分
243
发表于 2019-9-5 19:21:55 | 显示全部楼层
jefferyzhang 发表于 2019-9-5 18:06
我没用过这个接口,为啥会用这个接口分配buffer?
demo里有这么用的么?

哈哈哈,终于问了个有意义的问题,demo里面确实有,

打开mpp的编译verbose=1后,得到这个文件的编译命令如下:
/usr/bin/aarch64-linux-gnu-g++
  -O3 -DNDEBUG  
/mpp-release/build/linux/aarch64/test/CMakeFiles/mpi_dec_test.dir/mpi_dec_test.c.o
/mpp-release/build/linux/aarch64/test/CMakeFiles/mpi_dec_test.dir/mpp_event_trigger.c.o
/mpp-release/build/linux/aarch64/test/CMakeFiles/mpi_dec_test.dir/mpp_parse_cfg.c.o
-o mpi_dec_test
-L/usr/local/lib -rdynamic /mpp-release/build/linux/aarch64/utils/libutils.a
/mpp-release/build/linux/aarch64/mpp/librockchip_mpp.so.0
/mpp-release/build/linux/aarch64/mpp/librockchip_mpp_static.a
/mpp-release/build/linux/aarch64/mpp/codec/libmpp_codec.a
/mpp-release/build/linux/aarch64/mpp/codec/dec/avs/libcodec_avsd.a
/mpp-release/build/linux/aarch64/mpp/codec/dec/h263/libcodec_h263d.a
/mpp-release/build/linux/aarch64/mpp/codec/dec/h264/libcodec_h264d.a
/mpp-release/build/linux/aarch64/mpp/codec/dec/h265/libcodec_h265d.a
/mpp-release/build/linux/aarch64/mpp/codec/dec/m2v/libcodec_mpeg2d.a
/mpp-release/build/linux/aarch64/mpp/codec/dec/mpg4/libcodec_mpeg4d.a
/mpp-release/build/linux/aarch64/mpp/codec/dec/vp8/libcodec_vp8d.a
/mpp-release/build/linux/aarch64/mpp/codec/dec/vp9/libcodec_vp9d.a
/mpp-release/build/linux/aarch64/mpp/codec/dec/jpeg/libcodec_jpegd.a
/mpp-release/build/linux/aarch64/mpp/codec/enc/h264/libcodec_h264e.a
/mpp-release/build/linux/aarch64/mpp/codec/libmpp_rc.a
/mpp-release/build/linux/aarch64/mpp/codec/enc/jpeg/libcodec_jpege.a
/mpp-release/build/linux/aarch64/mpp/codec/enc/h265/libcodec_h265e.a
/mpp-release/build/linux/aarch64/mpp/codec/enc/vp8/libcodec_vp8e.a
/mpp-release/build/linux/aarch64/mpp/codec/enc/dummy/libcodec_dummy_enc.a
/mpp-release/build/linux/aarch64/mpp/codec/dec/dummy/libcodec_dummy_dec.a
/mpp-release/build/linux/aarch64/mpp/hal/libmpp_hal.a
/mpp-release/build/linux/aarch64/mpp/hal/rkdec/h264d/libhal_h264d.a
/mpp-release/build/linux/aarch64/mpp/hal/libmpp_hal.a
/mpp-release/build/linux/aarch64/mpp/hal/rkdec/h264d/libhal_h264d.a
/mpp-release/build/linux/aarch64/mpp/hal/rkdec/avsd/libhal_avsd.a
/mpp-release/build/linux/aarch64/mpp/hal/vpu/h263d/libhal_h263d.a
/mpp-release/build/linux/aarch64/mpp/hal/rkdec/h265d/libhal_h265d.a
/mpp-release/build/linux/aarch64/mpp/hal/vpu/m2vd/libhal_mpeg2d.a
/mpp-release/build/linux/aarch64/mpp/hal/vpu/mpg4d/libhal_mpeg4d.a
/mpp-release/build/linux/aarch64/mpp/hal/vpu/vp8d/libhal_vp8d.a
/mpp-release/build/linux/aarch64/mpp/hal/rkdec/vp9d/libhal_vp9d.a
/mpp-release/build/linux/aarch64/mpp/hal/vpu/jpegd/libhal_jpegd.a
/mpp-release/build/linux/aarch64/mpp/hal/common/h264/libhal_h264e.a
/mpp-release/build/linux/aarch64/mpp/hal/rkenc/h264e/libhal_h264e_rkv.a
/mpp-release/build/linux/aarch64/mpp/hal/vpu/h264e/libhal_h264e_vpu.a
/mpp-release/build/linux/aarch64/mpp/hal/common/h264/libhal_h264e.a
/mpp-release/build/linux/aarch64/mpp/hal/rkenc/h264e/libhal_h264e_rkv.a
/mpp-release/build/linux/aarch64/mpp/hal/vpu/h264e/libhal_h264e_vpu.a
/mpp-release/build/linux/aarch64/mpp/hal/common/libhal_common.a
/mpp-release/build/linux/aarch64/mpp/hal/vpu/jpege/libhal_jpege.a
/mpp-release/build/linux/aarch64/mpp/hal/rkenc/h265e/libhal_h265e.a
/mpp-release/build/linux/aarch64/mpp/hal/vpu/vp8e/libhal_vp8e.a
/mpp-release/build/linux/aarch64/mpp/hal/dummy/libhal_dummy.a
/mpp-release/build/linux/aarch64/mpp/hal/worker/mpp_device/libmpp_device.a
/mpp-release/build/linux/aarch64/mpp/vproc/libmpp_vproc.a
/mpp-release/build/linux/aarch64/mpp/vproc/rga/libvproc_rga.a
/mpp-release/build/linux/aarch64/mpp/base/libmpp_base.a
/mpp-release/build/linux/aarch64/osal/libosal.a
-lpthread
/mpp-release/build/linux/aarch64/mpp/vproc/iep/libvproc_iep.a
-Wl,-rpath,/mpp-release/build/linux/aarch64/mpp




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

zhouzhouzlove

中级会员

积分
243
发表于 2019-9-5 19:24:49 | 显示全部楼层
本帖最后由 zhouzhouzlove 于 2019-9-5 19:33 编辑

请删除这一层,刚才论坛出bug了,无法回帖,现在又突然全部都出来了。。。。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

zhouzhouzlove

中级会员

积分
243
发表于 2019-9-5 19:26:45 | 显示全部楼层
论坛有bug,我现在无法直接回复你的问题(提交不了),只能重新来一层
确实是的demo里面的用法

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

zhouzhouzlove

中级会员

积分
243
发表于 2019-9-5 19:28:32 | 显示全部楼层
论坛有bug,我现在无法直接回复你的问题(提交不了),只能重新来一层
确实是的demo里面的用法
详见demo的538行,我无法发送图片,论坛有bug
回复

使用道具 举报

zhouzhouzlove

中级会员

积分
243
发表于 2019-9-5 19:34:23 | 显示全部楼层
你们的论坛有bug。。。。。。。。。。请删除重复的楼层、。、、、、、、、
要不整的我跟个二愣子一样。。。。。
回复

使用道具 举报

kiwi

中级会员

积分
252
QQ
发表于 2019-9-5 21:47:30 | 显示全部楼层
zhouzhouzlove 发表于 2019-9-5 14:18
我目前这样做了,目前情况如下:

我是在mpi_dec_test的基础上做的修改,增加了ffmpeg的功能,添加了ffmpe ...

mpp_malloc就是申请一块内存罢了,用malloc也是一样的,二者没有区别
回复

使用道具 举报

zhouzhouzlove

中级会员

积分
243
发表于 2019-9-6 09:50:17 | 显示全部楼层
kiwi 发表于 2019-9-5 21:47
mpp_malloc就是申请一块内存罢了,用malloc也是一样的,二者没有区别

当直接把ffmpeg的packet中的data给到mpp的packet的时候,是否遇见过这个报错:
mpp_packet: Assertion p->data <= p->pos failed at mpp_packet_set_pos:196
mpp_packet: Assertion p->data <= p->pos failed at mpp_packet_set_pos:196
mpp_packet: Assertion p->data <= p->pos failed at mpp_packet_set_pos:196
mpp_packet: Assertion p->data <= p->pos failed at mpp_packet_set_pos:196
mpp_packet: Assertion p->size >= p->length failed at mpp_packet_set_pos:197
mpp_packet: Assertion p->data <= p->pos failed at mpp_packet_set_pos:196
mpp_packet: Assertion p->data <= p->pos failed at mpp_packet_set_pos:196
mpp_packet: Assertion p->size >= p->length failed at mpp_packet_set_pos:197
回复

使用道具 举报

swlmx

注册会员

积分
117
发表于 2019-9-10 14:33:50 | 显示全部楼层
楼主好。我在Android环境下用java的MediaCodec API读取YUV编码h.264,然后demsg显示要20毫秒编码一帧,达不到同时两路1080p@30fps呢?

下面是编码的代码

  1. public void encode(byte[] yuvFrame){
  2.         int inputBufferIndex = codec.dequeueInputBuffer(-1);

  3.         if (inputBufferIndex >= 0) {
  4.             ByteBuffer inputBuffer;
  5.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  6.                 inputBuffer = codec.getInputBuffer(inputBufferIndex);
  7.             } else {
  8.                 inputBuffer = codec.getInputBuffers()[inputBufferIndex];
  9.             }
  10.             pts = computePresentationTime(generateIndex);
  11.             if (inputBuffer != null) {
  12.                 inputBuffer.clear();
  13.                 inputBuffer.put(yuvFrame, 0, yuvFrame.length);
  14.                 codec.queueInputBuffer(inputBufferIndex, 0, yuvFrame.length, pts, 0);
  15.             }
  16.             generateIndex += 1;
  17.         }
  18.         MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();

  19.         int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, DEFAULT_TIMEOUT_US);

  20.         while (outputBufferIndex >= 0) {
  21.             ByteBuffer outputBuffer;
  22.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  23.                 outputBuffer = codec.getOutputBuffer(outputBufferIndex);
  24.             } else {
  25.                 outputBuffer = codec.getOutputBuffers()[outputBufferIndex];
  26.             }
  27.             if (outputBuffer != null) {
  28.                 byte[] outData = new byte[bufferInfo.size];
  29.                 outputBuffer.get(outData);
  30.                 if (bufferInfo.flags == 2) {
  31.                     configByte = outData;
  32.                 } else if (bufferInfo.flags == 1) {
  33.                     byte[] keyframe = new byte[bufferInfo.size + configByte.length];
  34.                     System.arraycopy(configByte, 0, keyframe, 0, configByte.length);
  35.                     System.arraycopy(outData, 0, keyframe, configByte.length, outData.length);

  36.                     if (null != callback) {
  37.                         callback.onFrame(this, keyframe);
  38.                     }
  39.                 } else {
  40.                     if (null != callback) {
  41.                         callback.onFrame(this, outData);
  42.                     }
  43.                 }

  44.                 codec.releaseOutputBuffer(outputBufferIndex, false);
  45.             }
  46.             outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, DEFAULT_TIMEOUT_US);
  47.         }
  48.     }

  49.     /**
  50.      * Generates the presentation time for frame N, in microseconds.
  51.      */
  52.     private long computePresentationTime(long frameIndex) {
  53.         return frameIndex * 1000000 / FPS;
  54.     }
复制代码
回复

使用道具 举报

jefferyzhang

超级版主

积分
2267
 楼主| 发表于 2019-9-11 08:18:39 | 显示全部楼层
swlmx 发表于 2019-9-10 14:33
楼主好。我在Android环境下用java的MediaCodec API读取YUV编码h.264,然后demsg显示要20毫秒编码一帧,达不 ...

编码在VPU跑 300MHz情况下只能一路1080p30,
跑2路需要将频率提到400MHz或者更高
回复

使用道具 举报

swlmx

注册会员

积分
117
发表于 2019-9-12 15:54:24 | 显示全部楼层
jefferyzhang 发表于 2019-9-11 08:18
编码在VPU跑 300MHz情况下只能一路1080p30,
跑2路需要将频率提到400MHz或者更高 ...

那怎么提升VPU频率呢
回复

使用道具 举报

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

本版积分规则

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


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