0

組み込みの RenderScript スクリプトを使用して NV21 を RGBA8888 に変換しようとしていますが、Allocation オブジェクトのバッファーのサイズを確認しても、次のエラーが発生します。 Fatal signal 11 (SIGSEGV) at 0x4eb30000 (code=1), thread 18458 (epthsyncexample)

私のコード:

 rs = RenderScript.create(context);
    yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.U8_4(rs));


    Type.Builder yuvType = new Type.Builder(rs, Element.U8_4(rs))
            .setX(1280).setY(720)
            .setYuvFormat(android.graphics.ImageFormat.NV21);
    Allocation in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);
    in.copyFrom(YUVArray); //<<<<<<<<<<<<<<<<<<<<<<<<<<


    Type.Builder rgbaType = new Type.Builder(rs, Element.U8_4(rs))
            .setX(W).setY(H);
    Allocation out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT);

    byte[] RGBOut = new byte[W * H * 4];

    //

    yuvToRgbIntrinsic.setInput(in);
    yuvToRgbIntrinsic.forEach(out);

    out.copyTo(RGBOut);
    return RGBOut;

エラー自体はわかりやすいのですが、なぜ起こるのかわかりません。NV21 イメージを表すために使用するバイト配列のサイズは 1382400 バイトです。割り当てバッファは 1280*720*1.5 = 1382400 バイトです。マークされたコード行がセグメンテーション違反を引き起こした理由がわかりません。

ヒントはありますか?

thisthisのような投稿をいくつか読みましたが、それらはまったく異なる問題に関するものです。それと関係があるかもしれない唯一の質問はこれです。この制限についてどこで確認できますか?

4

1 に答える 1

0

コードに何度も手を加えた後、何が問題を引き起こしているのかがわかりました。コードをデバッグしているときに、競合状態か何かが発生したに違いありません。ユニットとの間でデータをロードするたびに、セグ フォールトが発生する可能性が高かったからです。

IF ALLOWED TO RUN が RenderScript セグメントに渡された場合に動作するようになったコードは次のとおりです。

public byte[] convertYUV2RGB(byte[] YUVArray, int H, int W){//W: 1280, H: 720

    //Convert using the premade script here.
    rs = RenderScript.create(context);
    yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.U8_4(rs));

    Type.Builder yuvType = new Type.Builder(rs, Element.U8(rs)).setX(YUVArray.length);

    Allocation in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);

    Type.Builder rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(W).setY(H);

    Allocation out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT);
    in.copyFrom(YUVArray);
    byte[] RGBOut = new byte[W * H * 4];

    yuvToRgbIntrinsic.setInput(in);
    yuvToRgbIntrinsic.forEach(out);

    out.copyTo(RGBOut);
    return RGBOut;
}
于 2016-02-08T17:04:35.780 に答える