1/* 2 * pixel format descriptor 3 * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at> 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22#include <inttypes.h> 23 24#include "libavutil/intreadwrite.h" 25 26typedef struct AVComponentDescriptor{ 27 uint16_t plane :2; ///< which of the 4 planes contains the component 28 uint16_t step_minus1 :3; ///< number of bytes between 2 horizontally consecutive pixels minus 1 29 uint16_t offset_plus1 :3; ///< number of bytes before the component of the first pixel plus 1 30 uint16_t shift :3; ///< number of lsb that must be shifted away to get the value 31 uint16_t depth_minus1 :4; ///< number of bits in the component minus 1 32}AVComponentDescriptor; 33 34/** 35 * Descriptor that unambiguously describes how the bits of a pixel are 36 * stored in the up to 4 data planes of an image. It also stores the 37 * subsampling factors and number of components. 38 * 39 * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV 40 * and all the YUV variants) AVPixFmtDescriptor just stores how values 41 * are stored not what these values represent. 42 */ 43typedef struct AVPixFmtDescriptor{ 44 uint8_t nb_channels; ///< The number of components each pixel has, (1-4) 45 46 /** 47 * Amount to shift the luma width right to find the chroma width. 48 * For YV12 this is 1 for example. 49 * chroma_width = -((-luma_width) >> log2_chroma_w) 50 * The note above is needed to ensure rounding up. 51 */ 52 uint8_t log2_chroma_w; ///< chroma_width = -((-luma_width )>>log2_chroma_w) 53 54 /** 55 * Amount to shift the luma height right to find the chroma height. 56 * For YV12 this is 1 for example. 57 * chroma_height= -((-luma_height) >> log2_chroma_h) 58 * The note above is needed to ensure rounding up. 59 */ 60 uint8_t log2_chroma_h; 61 uint8_t flags; 62 AVComponentDescriptor comp[4]; ///< parameters that describe how pixels are packed 63}AVPixFmtDescriptor; 64 65#define PIX_FMT_BE 1 ///< big-endian 66#define PIX_FMT_PAL 2 ///< Pixel format has a palette i data[1], values are indexes in this palette. 67#define PIX_FMT_BITSTREAM 4 ///< All values of a component are bit-wise packed end to end. 68 69 70static inline void read_line(uint16_t *dst, const uint8_t *data[4], const int linesize[4], AVPixFmtDescriptor *desc, int x, int y, int c, int w) 71{ 72 AVComponentDescriptor comp= desc->comp[c]; 73 int plane= comp.plane; 74 int depth= comp.depth_minus1+1; 75 int mask = (1<<depth)-1; 76 int shift= comp.shift; 77 int step = comp.step_minus1+1; 78 int flags= desc->flags; 79 const uint8_t *p= data[plane]+y*linesize[plane] + x * step + comp.offset_plus1 - 1; 80 81 //FIXME initial x in case of PIX_FMT_BITSTREAM is wrong 82 83 while(w--){ 84 int val; 85 if(flags & PIX_FMT_BE) val= AV_RB16(p); 86 else val= AV_RL16(p); 87 val = (val>>shift) & mask; 88 if(flags & PIX_FMT_PAL) 89 val= data[1][4*val + c]; 90 if(flags & PIX_FMT_BITSTREAM){ 91 shift-=depth; 92 while(shift<0){ 93 shift+=8; 94 p++; 95 } 96 }else 97 p+= step; 98 *dst++= val; 99 } 100} 101