저는 렌더 스크립트에 익숙하지 않고 몇 가지 시도를했습니다. 이것은 내가 시험해 본 모범이다. 모든 것이 잘 작동하는 것 같습니다.rsForEach가 null 할당으로 호출되었습니다.
public class RsYuv implements TextureView.SurfaceTextureListener
{
private int mHeight;
private int mWidth;
private RenderScript mRS;
private Allocation mAllocationOut;
private Allocation mAllocationIn;
private ScriptIntrinsicYuvToRGB mYuv;
private boolean mHaveSurface;
private Surface mSurface;
RsYuv(RenderScript rs) {
mRS = rs;
mYuv = ScriptIntrinsicYuvToRGB.create(rs, Element.RGBA_8888(mRS));
}
public void reset(int mWidth, int mHeight) {
Type.Builder tb = new Type.Builder(mRS, Element.RGBA_8888(mRS));
tb.setX(mWidth);
tb.setY(mHeight);
Type t = tb.create();
mAllocationOut = Allocation.createTyped(mRS, t, Allocation.USAGE_SCRIPT |
Allocation.USAGE_IO_OUTPUT | Allocation.USAGE_SHARED);
tb = new Type.Builder(mRS, Element.createPixel(mRS, Element.DataType.UNSIGNED_8, Element.DataKind.PIXEL_YUV));
tb.setX(mWidth);
tb.setY(mHeight);
tb.setYuvFormat(android.graphics.ImageFormat.NV21);
mAllocationIn = Allocation.createTyped(mRS, tb.create(), Allocation.USAGE_SCRIPT);
mYuv.setInput(mAllocationIn);
setupSurface();
}
void execute(byte[] yuv) {
mAllocationIn.copyFrom(yuv);
if (mHaveSurface) {
mYuv.forEach(mAllocationOut);
mAllocationOut.ioSend();
}
}
void setupSurface() {
if (mAllocationOut != null) {
mAllocationOut.setSurface(mSurface);
}
if (mSurface != null) {
mHaveSurface = true;
} else {
mHaveSurface = false;
}
}
}
이것은 잘 작동하는 것 같습니다. 그러나 다른 할당을 소개 할 때 항상 나에게 준다
non fatal RS error, rsForEach called with null out allocations
.
다음은 선언 후에 다른 할당을 초기화하는 방법입니다.
public void reset(int mWidth, mHeight) {
// after initializing mAllocationOut
mAllocationOut1 = Allocation.createTyped(mRS, mAllocationOut.getType(), Allocation.USAGE_SCRIPT | Allocation.USAGE_IO_OUTPUT | Allocation.USAGE_SHARED);
// further code
}
void execute(data[] yuv) {
if (mHaveSurface) {
mYuv.forEach(mAllocationOut);
mYuv.forEach(mAllocationOut1); // Here it gives the error
mAllocationOut.ioSend();
}
}
무엇이 문제 일 수 있습니까? mAllocationOut
사본을 만들고 싶습니다. copyFrom
을 사용해 보았지만, 자세한 오류없이 매번 충돌이 발생합니다. 어떤 도움을 주셔서 감사합니다.
로그에 백 트레이스가 더 이상 있습니까? 'copyFrom()'을 사용하면 근본 원인에 대한 더 많은 통찰력을 얻을 수 있습니다. –
이걸 보지만 무엇보다 먼저 : SCRIPT | IO_OUTPUT | SHARED는 mAllocationOu1에서 의미가 없습니다. SHARED와 IO_OUTPUT은 상호 배타적입니다. –