ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MediaCodec对超分的支持

2021-07-05 16:06:07  阅读:262  来源: 互联网

标签:chromaHeight int 超分 支持 buffer ByteBuffer MediaCodec frameBuffer final


Q:mediacode解码出来的数据的是在GPU上还是在cpu上?
A:https://source.android.com/devices/graphics/arch-bq-gralloc
结论应该是在RAM上,Gralloc内存分配器会分配内存给CPU、GPU。在使用过程中,传输内存句柄。

Q:使用的格式是什么?
A:YUV420/NV12 都有

Q:Android客户端能提供的数据是什么?
A:ByteBuffer buffer = codec.getOutputBuffers()
https://developer.android.com/reference/java/nio/ByteBuffer
PS:这里提供的是Direct buffers

Q: Android客户端期望接受的数据类型是什么?
A:

public interface I420Buffer extends Buffer {
ByteBuffer getDataY();
ByteBuffer getDataU();
ByteBuffer getDataV();
int getStrideY();
int getStrideU();
int getStrideV();
}

Q: 步骤能提供的数据和期望接受的数据类型可有转化的demo?
A:可以参考下面的实现。

private VideoFrame.Buffer copyI420Buffer(
    ByteBuffer buffer, int stride, int sliceHeight, int width, int height) {
if (stride % 2 != 0) {
    throw new AssertionError("Stride is not divisible by two: " + stride);
}
final int chromaWidth = (width + 1) / 2;
final int chromaHeight = (sliceHeight % 2 == 0) ? (height + 1) / 2 : height / 2;
final int uvStride = stride / 2;
final int yPos = 0;
final int yEnd = yPos + stride * height;
final int uPos = yPos + stride * sliceHeight;
final int uEnd = uPos + uvStride * chromaHeight;
final int vPos = uPos + uvStride * sliceHeight / 2;
final int vEnd = vPos + uvStride * chromaHeight;
I420Buffer frameBuffer = allocateI420Buffer(width, height);
buffer.limit(yEnd);
buffer.position(yPos);
copyPlane(
    buffer.slice(), stride, frameBuffer.getDataY(), frameBuffer.getStrideY(), width, height);
buffer.limit(uEnd);
buffer.position(uPos);
copyPlane(buffer.slice(), uvStride, frameBuffer.getDataU(), frameBuffer.getStrideU(),
    chromaWidth, chromaHeight);
if (sliceHeight % 2 == 1) {
    buffer.position(uPos + uvStride * (chromaHeight - 1)); // Seek to beginning of last full row.
    ByteBuffer dataU = frameBuffer.getDataU();
    dataU.position(frameBuffer.getStrideU() * chromaHeight); // Seek to beginning of last row.
    dataU.put(buffer); // Copy the last row.
}
buffer.limit(vEnd);
buffer.position(vPos);
copyPlane(buffer.slice(), uvStride, frameBuffer.getDataV(), frameBuffer.getStrideV(),
    chromaWidth, chromaHeight);
if (sliceHeight % 2 == 1) {
    buffer.position(vPos + uvStride * (chromaHeight - 1)); // Seek to beginning of last full row.
    ByteBuffer dataV = frameBuffer.getDataV();
    dataV.position(frameBuffer.getStrideV() * chromaHeight); // Seek to beginning of last row.
    dataV.put(buffer); // Copy the last row.
}
return frameBuffer;
}

标签:chromaHeight,int,超分,支持,buffer,ByteBuffer,MediaCodec,frameBuffer,final
来源: https://blog.csdn.net/yeshennet/article/details/118491762

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有