2014-06-18 6 views
0

저는 렌더 스크립트에 익숙하지 않고 몇 가지 시도를했습니다. 이것은 내가 시험해 본 모범이다. 모든 것이 잘 작동하는 것 같습니다.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을 사용해 보았지만, 자세한 오류없이 매번 충돌이 발생합니다. 어떤 도움을 주셔서 감사합니다.

+0

로그에 백 트레이스가 더 이상 있습니까? 'copyFrom()'을 사용하면 근본 원인에 대한 더 많은 통찰력을 얻을 수 있습니다. –

+2

이걸 보지만 무엇보다 먼저 : SCRIPT | IO_OUTPUT | SHARED는 mAllocationOu1에서 의미가 없습니다. SHARED와 IO_OUTPUT은 상호 배타적입니다. –

답변

3

위의 경고는 "경계면이없는 IO_INPUT/IO_INPUT에서 발생할 수 있습니다."라고 말하면서 내가보고있는 것으로 추측하고 있습니다. mAllocationOut1.setSurface를 호출 한 적이 있습니까? IO_OUTPUT을 사용하여 할당을 만들면 지원 저장소가 생성되지 않습니다. 배킹 스토어는 Surface와 관련된 모든 것으로부터옵니다. 이것은 copyTo를 사용하여 경고 및 충돌을 설명합니다. (앞으로 더 명확하게하기 위해 더 많은 오류 검사를 추가 할 필요가 있는지 살펴볼 것입니다.)