Home | History | Annotate | Download | only in editor
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef II420_COLOR_CONVERTER_H
     18 
     19 #define II420_COLOR_CONVERTER_H
     20 
     21 #include <stdint.h>
     22 #include <android/rect.h>
     23 
     24 #ifdef __cplusplus
     25 extern "C" {
     26 #endif
     27 
     28 typedef struct II420ColorConverter {
     29 
     30     /*
     31      * getDecoderOutputFormat
     32      * Returns the color format (OMX_COLOR_FORMATTYPE) of the decoder output.
     33      * If it is I420 (OMX_COLOR_FormatYUV420Planar), no conversion is needed,
     34      * and convertDecoderOutputToI420() can be a no-op.
     35      */
     36     int (*getDecoderOutputFormat)();
     37 
     38     /*
     39      * convertDecoderOutputToI420
     40      * @Desc     Converts from the decoder output format to I420 format.
     41      * @note     Caller (e.g. VideoEditor) owns the buffers
     42      * @param    decoderBits   (IN) Pointer to the buffer contains decoder output
     43      * @param    decoderWidth  (IN) Buffer width, as reported by the decoder
     44      *                              metadata (kKeyWidth)
     45      * @param    decoderHeight (IN) Buffer height, as reported by the decoder
     46      *                              metadata (kKeyHeight)
     47      * @param    decoderRect   (IN) The rectangle of the actual frame, as
     48      *                              reported by decoder metadata (kKeyCropRect)
     49      * @param    dstBits      (OUT) Pointer to the output I420 buffer
     50      * @return   -1 Any error
     51      * @return   0  No Error
     52      */
     53     int (*convertDecoderOutputToI420)(
     54         void* decoderBits, int decoderWidth, int decoderHeight,
     55         ARect decoderRect, void* dstBits);
     56 
     57     /*
     58      * getEncoderIntputFormat
     59      * Returns the color format (OMX_COLOR_FORMATTYPE) of the encoder input.
     60      * If it is I420 (OMX_COLOR_FormatYUV420Planar), no conversion is needed,
     61      * and convertI420ToEncoderInput() and getEncoderInputBufferInfo() can
     62      * be no-ops.
     63      */
     64     int (*getEncoderInputFormat)();
     65 
     66     /* convertI420ToEncoderInput
     67      * @Desc     This function converts from I420 to the encoder input format
     68      * @note     Caller (e.g. VideoEditor) owns the buffers
     69      * @param    srcBits       (IN) Pointer to the input I420 buffer
     70      * @param    srcWidth      (IN) Width of the I420 frame
     71      * @param    srcHeight     (IN) Height of the I420 frame
     72      * @param    encoderWidth  (IN) Encoder buffer width, as calculated by
     73      *                              getEncoderBufferInfo()
     74      * @param    encoderHeight (IN) Encoder buffer height, as calculated by
     75      *                              getEncoderBufferInfo()
     76      * @param    encoderRect   (IN) Rect coordinates of the actual frame inside
     77      *                              the encoder buffer, as calculated by
     78      *                              getEncoderBufferInfo().
     79      * @param    encoderBits  (OUT) Pointer to the output buffer. The size of
     80      *                              this buffer is calculated by
     81      *                              getEncoderBufferInfo()
     82      * @return   -1 Any error
     83      * @return   0  No Error
     84      */
     85     int (*convertI420ToEncoderInput)(
     86         void* srcBits, int srcWidth, int srcHeight,
     87         int encoderWidth, int encoderHeight, ARect encoderRect,
     88         void* encoderBits);
     89 
     90     /* getEncoderInputBufferInfo
     91      * @Desc     This function returns metadata for the encoder input buffer
     92      *           based on the actual I420 frame width and height.
     93      * @note     This API should be be used to obtain the necessary information
     94      *           before calling convertI420ToEncoderInput().
     95      *           VideoEditor knows only the width and height of the I420 buffer,
     96      *           but it also needs know the width, height, and size of the
     97      *           encoder input buffer. The encoder input buffer width and height
     98      *           are used to set the metadata for the encoder.
     99      * @param    srcWidth      (IN) Width of the I420 frame
    100      * @param    srcHeight     (IN) Height of the I420 frame
    101      * @param    encoderWidth  (OUT) Encoder buffer width needed
    102      * @param    encoderHeight (OUT) Encoder buffer height needed
    103      * @param    encoderRect   (OUT) Rect coordinates of the actual frame inside
    104      *                               the encoder buffer
    105      * @param    encoderBufferSize  (OUT) The size of the buffer that need to be
    106      *                              allocated by the caller before invoking
    107      *                              convertI420ToEncoderInput().
    108      * @return   -1 Any error
    109      * @return   0  No Error
    110      */
    111     int (*getEncoderInputBufferInfo)(
    112         int srcWidth, int srcHeight,
    113         int* encoderWidth, int* encoderHeight,
    114         ARect* encoderRect, int* encoderBufferSize);
    115 
    116 } II420ColorConverter;
    117 
    118 /* The only function that the shared library needs to expose: It fills the
    119    function pointers in II420ColorConverter */
    120 void getI420ColorConverter(II420ColorConverter *converter);
    121 
    122 #if defined(__cplusplus)
    123 }
    124 #endif
    125 
    126 #endif  // II420_COLOR_CONVERTER_H
    127