即使大小合适,RenderScript的分配也会出错

时间:2016-02-08 13:58:05

标签: android renderscript google-project-tango android-renderscript

我正在尝试使用内置的RenderScript脚本将NV21转换为RGBA8888,但即使是thoguh我在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,但它们是完全不同的问题。可能与之有关的唯一问题是this one。我在哪里可以找到这个限制?

1 个答案:

答案 0 :(得分:0)

经过大量干预代码后,我意识到导致问题的原因。当我通过代码进行调试时,我必然会引起一些竞争条件或某些因素,因为每次我从单元加载数据时,我都很有可能遇到一个seg错误。

我最终得到的代码如果允许运行通过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;
}