Mercurial > libavcodec.hg
annotate rawdec.c @ 10874:bcfe2acbf190 libavcodec
AAC: Compress codebook tables and optimise sign bit handling
The codebooks each consist of small number of values repeated in
groups of 2 or 4. Storing the codebooks as a packed list of 2- or
4-bit indexes into a table reduces their size substantially (from 7.5k
to 1.5k), resulting in less cache pressure.
For the band types with sign bits in the bitstream, storing the number
and position of non-zero codebook values using a few bits avoids
multiple get_bits() calls and floating-point comparisons which gcc
handles miserably.
Some float/int type punning also avoids gcc brain damage.
Overall speedup 20-35% on Cortex-A8, 20% on Core i7.
| author | mru |
|---|---|
| date | Wed, 13 Jan 2010 16:46:28 +0000 |
| parents | 98520e1f1f53 |
| children | 1184d065c26a |
| rev | line source |
|---|---|
| 5264 | 1 /* |
| 2 * Raw Video Decoder | |
|
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8023
diff
changeset
|
3 * Copyright (c) 2001 Fabrice Bellard |
| 5264 | 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 /** | |
|
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8629
diff
changeset
|
23 * @file libavcodec/rawdec.c |
| 5264 | 24 * Raw Video Decoder |
| 25 */ | |
| 26 | |
| 27 #include "avcodec.h" | |
| 28 #include "raw.h" | |
| 9335 | 29 #include "libavutil/intreadwrite.h" |
| 5264 | 30 |
| 31 typedef struct RawVideoContext { | |
| 32 unsigned char * buffer; /* block of memory for holding one frame */ | |
| 33 int length; /* number of bytes in buffer */ | |
|
8993
80720c5427a0
Fix raw rgb/bgr vertical flip in avi based on info from http://www.fourcc.org/fccbihgt.php.
michael
parents:
8718
diff
changeset
|
34 int flip; |
| 5264 | 35 AVFrame pic; ///< AVCodecContext.coded_frame |
| 36 } RawVideoContext; | |
| 37 | |
| 38 static const PixelFormatTag pixelFormatBpsAVI[] = { | |
| 5419 | 39 { PIX_FMT_PAL8, 4 }, |
| 5264 | 40 { PIX_FMT_PAL8, 8 }, |
| 41 { PIX_FMT_RGB555, 15 }, | |
| 42 { PIX_FMT_RGB555, 16 }, | |
| 43 { PIX_FMT_BGR24, 24 }, | |
| 44 { PIX_FMT_RGB32, 32 }, | |
|
8023
76f6a08c9fe6
Fix some icc warnings by using enum PixelFormat instead of int where appropriate.
cehoyos
parents:
7823
diff
changeset
|
45 { PIX_FMT_NONE, 0 }, |
| 5264 | 46 }; |
| 47 | |
| 48 static const PixelFormatTag pixelFormatBpsMOV[] = { | |
|
10756
d2c1c2f835b7
Support raw black&white in mov, fixes issue 1654.
cehoyos
parents:
10736
diff
changeset
|
49 { PIX_FMT_MONOWHITE, 1 }, |
|
10772
c76ee970d3bd
Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents:
10771
diff
changeset
|
50 { PIX_FMT_PAL8, 2 }, |
| 6423 | 51 { PIX_FMT_PAL8, 4 }, |
| 5264 | 52 { PIX_FMT_PAL8, 8 }, |
| 9620 | 53 // FIXME swscale does not support 16 bit in .mov, sample 16bit.mov |
| 54 // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html | |
|
10757
9de8bd6b4ca4
Fix colourspace for 16 bit raw video in mov, fixes issue 1527 on big-endian.
cehoyos
parents:
10756
diff
changeset
|
55 { PIX_FMT_RGB555BE, 16 }, |
| 5264 | 56 { PIX_FMT_RGB24, 24 }, |
|
10736
8a9b0b693a30
Use correct pixfmt for 32 bit raw in mov also on big-endian, fixes issue 1630.
cehoyos
parents:
10390
diff
changeset
|
57 { PIX_FMT_ARGB, 32 }, |
|
8023
76f6a08c9fe6
Fix some icc warnings by using enum PixelFormat instead of int where appropriate.
cehoyos
parents:
7823
diff
changeset
|
58 { PIX_FMT_NONE, 0 }, |
| 5264 | 59 }; |
| 60 | |
|
8023
76f6a08c9fe6
Fix some icc warnings by using enum PixelFormat instead of int where appropriate.
cehoyos
parents:
7823
diff
changeset
|
61 static enum PixelFormat findPixelFormat(const PixelFormatTag *tags, unsigned int fourcc) |
| 5264 | 62 { |
| 63 while (tags->pix_fmt >= 0) { | |
| 64 if (tags->fourcc == fourcc) | |
| 65 return tags->pix_fmt; | |
| 66 tags++; | |
| 67 } | |
| 68 return PIX_FMT_YUV420P; | |
| 69 } | |
| 70 | |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6424
diff
changeset
|
71 static av_cold int raw_init_decoder(AVCodecContext *avctx) |
| 5264 | 72 { |
| 73 RawVideoContext *context = avctx->priv_data; | |
| 74 | |
| 75 if (avctx->codec_tag == MKTAG('r','a','w',' ')) | |
|
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7040
diff
changeset
|
76 avctx->pix_fmt = findPixelFormat(pixelFormatBpsMOV, avctx->bits_per_coded_sample); |
|
10850
98520e1f1f53
Support uncompressed ("Resolution 1:1") Avid AVI Codec, (partially) fixes issue 1474.
cehoyos
parents:
10773
diff
changeset
|
77 else if (avctx->codec_tag == MKTAG('A', 'V', 'R', 'n')) |
|
98520e1f1f53
Support uncompressed ("Resolution 1:1") Avid AVI Codec, (partially) fixes issue 1474.
cehoyos
parents:
10773
diff
changeset
|
78 avctx->pix_fmt = PIX_FMT_UYVY422; // Avid AVI Codec "Resolution 1:1" |
| 5264 | 79 else if (avctx->codec_tag) |
| 80 avctx->pix_fmt = findPixelFormat(ff_raw_pixelFormatTags, avctx->codec_tag); | |
|
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7040
diff
changeset
|
81 else if (avctx->bits_per_coded_sample) |
|
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7040
diff
changeset
|
82 avctx->pix_fmt = findPixelFormat(pixelFormatBpsAVI, avctx->bits_per_coded_sample); |
| 5264 | 83 |
| 84 context->length = avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height); | |
| 85 context->buffer = av_malloc(context->length); | |
| 86 context->pic.pict_type = FF_I_TYPE; | |
| 87 context->pic.key_frame = 1; | |
| 88 | |
| 89 avctx->coded_frame= &context->pic; | |
| 90 | |
| 91 if (!context->buffer) | |
| 92 return -1; | |
| 93 | |
|
9845
45d331133468
Add new FOURCC (0x0003) for raw DIB video, set flip flag accordingly.
darkshikari
parents:
9712
diff
changeset
|
94 if((avctx->extradata_size >= 9 && !memcmp(avctx->extradata + avctx->extradata_size - 9, "BottomUp", 9)) || |
|
45d331133468
Add new FOURCC (0x0003) for raw DIB video, set flip flag accordingly.
darkshikari
parents:
9712
diff
changeset
|
95 avctx->codec_tag == MKTAG( 3 , 0 , 0 , 0 )) |
|
8993
80720c5427a0
Fix raw rgb/bgr vertical flip in avi based on info from http://www.fourcc.org/fccbihgt.php.
michael
parents:
8718
diff
changeset
|
96 context->flip=1; |
|
80720c5427a0
Fix raw rgb/bgr vertical flip in avi based on info from http://www.fourcc.org/fccbihgt.php.
michael
parents:
8718
diff
changeset
|
97 |
| 5264 | 98 return 0; |
| 99 } | |
| 100 | |
| 101 static void flip(AVCodecContext *avctx, AVPicture * picture){ | |
| 8995 | 102 picture->data[0] += picture->linesize[0] * (avctx->height-1); |
| 103 picture->linesize[0] *= -1; | |
| 5264 | 104 } |
| 105 | |
| 106 static int raw_decode(AVCodecContext *avctx, | |
| 107 void *data, int *data_size, | |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9335
diff
changeset
|
108 AVPacket *avpkt) |
| 5264 | 109 { |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9335
diff
changeset
|
110 const uint8_t *buf = avpkt->data; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9335
diff
changeset
|
111 int buf_size = avpkt->size; |
| 5264 | 112 RawVideoContext *context = avctx->priv_data; |
| 113 | |
| 114 AVFrame * frame = (AVFrame *) data; | |
| 115 AVPicture * picture = (AVPicture *) data; | |
| 116 | |
| 117 frame->interlaced_frame = avctx->coded_frame->interlaced_frame; | |
| 118 frame->top_field_first = avctx->coded_frame->top_field_first; | |
| 119 | |
|
10773
8413193405c5
Cosmetics: Fix indentation and comment after r21027.
cehoyos
parents:
10772
diff
changeset
|
120 //2bpp and 4bpp raw in avi and mov (yes this is ugly ...) |
|
10772
c76ee970d3bd
Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents:
10771
diff
changeset
|
121 if((avctx->bits_per_coded_sample == 4 || avctx->bits_per_coded_sample == 2) && |
|
c76ee970d3bd
Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents:
10771
diff
changeset
|
122 avctx->pix_fmt==PIX_FMT_PAL8 && |
| 6424 | 123 (!avctx->codec_tag || avctx->codec_tag == MKTAG('r','a','w',' '))){ |
| 5419 | 124 int i; |
|
10771
cea7769a2b62
Improve readability of 4bpp raw decoder and prepare for supporting 2bpp.
cehoyos
parents:
10757
diff
changeset
|
125 uint8_t *dst = context->buffer + 256*4; |
|
cea7769a2b62
Improve readability of 4bpp raw decoder and prepare for supporting 2bpp.
cehoyos
parents:
10757
diff
changeset
|
126 buf_size = context->length - 256*4; |
|
10772
c76ee970d3bd
Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents:
10771
diff
changeset
|
127 if (avctx->bits_per_coded_sample == 4){ |
|
10773
8413193405c5
Cosmetics: Fix indentation and comment after r21027.
cehoyos
parents:
10772
diff
changeset
|
128 for(i=0; 2*i+1 < buf_size; i++){ |
|
8413193405c5
Cosmetics: Fix indentation and comment after r21027.
cehoyos
parents:
10772
diff
changeset
|
129 dst[2*i+0]= buf[i]>>4; |
|
8413193405c5
Cosmetics: Fix indentation and comment after r21027.
cehoyos
parents:
10772
diff
changeset
|
130 dst[2*i+1]= buf[i]&15; |
|
8413193405c5
Cosmetics: Fix indentation and comment after r21027.
cehoyos
parents:
10772
diff
changeset
|
131 } |
|
10772
c76ee970d3bd
Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents:
10771
diff
changeset
|
132 } else |
|
c76ee970d3bd
Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents:
10771
diff
changeset
|
133 for(i=0; 4*i+3 < buf_size; i++){ |
|
c76ee970d3bd
Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents:
10771
diff
changeset
|
134 dst[4*i+0]= buf[i]>>6; |
|
c76ee970d3bd
Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents:
10771
diff
changeset
|
135 dst[4*i+1]= buf[i]>>4&3; |
|
c76ee970d3bd
Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents:
10771
diff
changeset
|
136 dst[4*i+2]= buf[i]>>2&3; |
|
c76ee970d3bd
Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents:
10771
diff
changeset
|
137 dst[4*i+3]= buf[i] &3; |
|
c76ee970d3bd
Support decoding raw 2bpp in mov, fixes issue 1528.
cehoyos
parents:
10771
diff
changeset
|
138 } |
|
10771
cea7769a2b62
Improve readability of 4bpp raw decoder and prepare for supporting 2bpp.
cehoyos
parents:
10757
diff
changeset
|
139 buf= dst; |
| 5419 | 140 } |
| 141 | |
| 5264 | 142 if(buf_size < context->length - (avctx->pix_fmt==PIX_FMT_PAL8 ? 256*4 : 0)) |
| 143 return -1; | |
| 144 | |
| 145 avpicture_fill(picture, buf, avctx->pix_fmt, avctx->width, avctx->height); | |
| 146 if(avctx->pix_fmt==PIX_FMT_PAL8 && buf_size < context->length){ | |
| 147 frame->data[1]= context->buffer; | |
| 148 } | |
| 149 if (avctx->palctrl && avctx->palctrl->palette_changed) { | |
| 150 memcpy(frame->data[1], avctx->palctrl->palette, AVPALETTE_SIZE); | |
| 151 avctx->palctrl->palette_changed = 0; | |
| 152 } | |
| 153 | |
|
8993
80720c5427a0
Fix raw rgb/bgr vertical flip in avi based on info from http://www.fourcc.org/fccbihgt.php.
michael
parents:
8718
diff
changeset
|
154 if(context->flip) |
| 8995 | 155 flip(avctx, picture); |
| 5264 | 156 |
| 9712 | 157 if ( avctx->codec_tag == MKTAG('Y', 'V', '1', '2') |
| 158 || avctx->codec_tag == MKTAG('Y', 'V', 'U', '9')) | |
| 10390 | 159 FFSWAP(uint8_t *, picture->data[1], picture->data[2]); |
| 5264 | 160 |
| 9335 | 161 if(avctx->codec_tag == AV_RL32("yuv2") && |
| 162 avctx->pix_fmt == PIX_FMT_YUYV422) { | |
| 163 int x, y; | |
| 164 uint8_t *line = picture->data[0]; | |
| 165 for(y = 0; y < avctx->height; y++) { | |
| 166 for(x = 0; x < avctx->width; x++) | |
| 167 line[2*x + 1] ^= 0x80; | |
| 168 line += picture->linesize[0]; | |
| 169 } | |
| 170 } | |
| 171 | |
| 5264 | 172 *data_size = sizeof(AVPicture); |
| 173 return buf_size; | |
| 174 } | |
| 175 | |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6424
diff
changeset
|
176 static av_cold int raw_close_decoder(AVCodecContext *avctx) |
| 5264 | 177 { |
| 178 RawVideoContext *context = avctx->priv_data; | |
| 179 | |
| 180 av_freep(&context->buffer); | |
| 181 return 0; | |
| 182 } | |
| 183 | |
| 184 AVCodec rawvideo_decoder = { | |
| 185 "rawvideo", | |
| 186 CODEC_TYPE_VIDEO, | |
| 187 CODEC_ID_RAWVIDEO, | |
| 188 sizeof(RawVideoContext), | |
| 189 raw_init_decoder, | |
| 190 NULL, | |
| 191 raw_close_decoder, | |
| 192 raw_decode, | |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
193 .long_name = NULL_IF_CONFIG_SMALL("raw video"), |
| 5264 | 194 }; |
