16ab97682fd444586ee135912a4210417a1c8781bJason Sams/*
28fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * Copyright (C) 2012 The Android Open Source Project
36ab97682fd444586ee135912a4210417a1c8781bJason Sams *
46ab97682fd444586ee135912a4210417a1c8781bJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
56ab97682fd444586ee135912a4210417a1c8781bJason Sams * you may not use this file except in compliance with the License.
66ab97682fd444586ee135912a4210417a1c8781bJason Sams * You may obtain a copy of the License at
76ab97682fd444586ee135912a4210417a1c8781bJason Sams *
86ab97682fd444586ee135912a4210417a1c8781bJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
96ab97682fd444586ee135912a4210417a1c8781bJason Sams *
106ab97682fd444586ee135912a4210417a1c8781bJason Sams * Unless required by applicable law or agreed to in writing, software
116ab97682fd444586ee135912a4210417a1c8781bJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
126ab97682fd444586ee135912a4210417a1c8781bJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136ab97682fd444586ee135912a4210417a1c8781bJason Sams * See the License for the specific language governing permissions and
146ab97682fd444586ee135912a4210417a1c8781bJason Sams * limitations under the License.
156ab97682fd444586ee135912a4210417a1c8781bJason Sams */
166ab97682fd444586ee135912a4210417a1c8781bJason Sams
176ab97682fd444586ee135912a4210417a1c8781bJason Samspackage android.renderscript;
186ab97682fd444586ee135912a4210417a1c8781bJason Sams
196ab97682fd444586ee135912a4210417a1c8781bJason Sams
206ab97682fd444586ee135912a4210417a1c8781bJason Sams/**
21e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams * Intrinsic for converting an Android YUV buffer to RGB.
22e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams *
23e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams * The input allocation is supplied in NV21 format as a U8
24e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams * element type. The output is RGBA, the alpha channel will be
25e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams * set to 255.
26e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams */
27e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Samspublic final class ScriptIntrinsicYuvToRGB extends ScriptIntrinsic {
28e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    private Allocation mInput;
29e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams
306ab97682fd444586ee135912a4210417a1c8781bJason Sams    ScriptIntrinsicYuvToRGB(int id, RenderScript rs) {
316ab97682fd444586ee135912a4210417a1c8781bJason Sams        super(id, rs);
326ab97682fd444586ee135912a4210417a1c8781bJason Sams    }
336ab97682fd444586ee135912a4210417a1c8781bJason Sams
34e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    /**
35e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     * Create an intrinsic for converting YUV to RGB.
36e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     *
37e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     * Supported elements types are {@link Element#U8_4}
38e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     *
39e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     * @param rs The Renderscript context
40e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     * @param e Element type for output
41e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     *
42e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     * @return ScriptIntrinsicYuvToRGB
43e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     */
44e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    public static ScriptIntrinsicYuvToRGB create(RenderScript rs, Element e) {
45e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams        // 6 comes from RS_SCRIPT_INTRINSIC_YUV_TO_RGB in rsDefines.h
46e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams        int id = rs.nScriptIntrinsicCreate(6, e.getID(rs));
47e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams        ScriptIntrinsicYuvToRGB si = new ScriptIntrinsicYuvToRGB(id, rs);
48e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams        return si;
49e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    }
506ab97682fd444586ee135912a4210417a1c8781bJason Sams
516ab97682fd444586ee135912a4210417a1c8781bJason Sams
52e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    /**
53e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     * Set the input yuv allocation, must be {@link Element#U8}.
54e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     *
55e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     * @param ain The input allocation.
56e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     */
57e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    public void setInput(Allocation ain) {
58e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams        mInput = ain;
59e6a7886674c167b4e17f6dc72d41d5b9c604cdd1Jason Sams        setVar(0, ain);
60e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    }
616ab97682fd444586ee135912a4210417a1c8781bJason Sams
62e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    /**
63e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     * Convert the image to RGB.
64e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     *
65e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     * @param aout Output allocation. Must match creation element
66e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     *             type.
67e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     */
68e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    public void forEach(Allocation aout) {
69e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams        forEach(0, null, aout, null);
70e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    }
716ab97682fd444586ee135912a4210417a1c8781bJason Sams
72e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    /**
73e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     * Get a KernelID for this intrinsic kernel.
74e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     *
75e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     * @return Script.KernelID The KernelID object.
76e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     */
77e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    public Script.KernelID getKernelID() {
78e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams        return createKernelID(0, 2, null, null);
796ab97682fd444586ee135912a4210417a1c8781bJason Sams    }
806ab97682fd444586ee135912a4210417a1c8781bJason Sams
81e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    /**
82e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     * Get a FieldID for the input field of this intrinsic.
83e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     *
84e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     * @return Script.FieldID The FieldID object.
85e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams     */
86e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    public Script.FieldID getFieldID_Input() {
87e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams        return createFieldID(0, null);
88e69e9e6b6e77d6c7b1ba2719b7aa7001bbbabb32Jason Sams    }
896ab97682fd444586ee135912a4210417a1c8781bJason Sams}
90