Mercurial > libavcodec.hg
annotate dv.c @ 8991:ca768cb2bfb6 libavcodec
Use last decoded SPS as current SPS in order to parse picture timing SEI
correctly. This works around an apparent H.264 standard deficiency.
Patch by Ivan Schreter, schreter gmx net
| author | cehoyos |
|---|---|
| date | Fri, 20 Feb 2009 16:20:01 +0000 |
| parents | cc8f95accbff |
| children | 54bc8a2727b0 |
| rev | line source |
|---|---|
| 723 | 1 /* |
| 2 * DV decoder | |
|
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8596
diff
changeset
|
3 * Copyright (c) 2002 Fabrice Bellard |
|
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8596
diff
changeset
|
4 * Copyright (c) 2004 Roman Shaposhnik |
| 723 | 5 * |
| 2967 | 6 * DV encoder |
|
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8596
diff
changeset
|
7 * Copyright (c) 2003 Roman Shaposhnik |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
8 * |
| 3167 | 9 * 50 Mbps (DVCPRO50) support |
| 10 * Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com> | |
| 11 * | |
|
7715
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
12 * 100 Mbps (DVCPRO HD) support |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
13 * Initial code by Daniel Maas <dmaas@maasdigital.com> (funded by BBC R&D) |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
14 * Final code by Roman Shaposhnik |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
15 * |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
16 * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
17 * of DV technical info. |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
18 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3806
diff
changeset
|
19 * This file is part of FFmpeg. |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3806
diff
changeset
|
20 * |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3806
diff
changeset
|
21 * FFmpeg is free software; you can redistribute it and/or |
| 723 | 22 * modify it under the terms of the GNU Lesser General Public |
| 23 * License as published by the Free Software Foundation; either | |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3806
diff
changeset
|
24 * version 2.1 of the License, or (at your option) any later version. |
| 723 | 25 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3806
diff
changeset
|
26 * FFmpeg is distributed in the hope that it will be useful, |
| 723 | 27 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 29 * Lesser General Public License for more details. | |
| 30 * | |
| 31 * You should have received a copy of the GNU Lesser General Public | |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3806
diff
changeset
|
32 * License along with FFmpeg; if not, write to the Free Software |
|
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
3016
diff
changeset
|
33 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 723 | 34 */ |
| 1106 | 35 |
| 36 /** | |
|
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8716
diff
changeset
|
37 * @file libavcodec/dv.c |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
38 * DV codec. |
| 1106 | 39 */ |
| 3649 | 40 #define ALT_BITSTREAM_READER |
| 723 | 41 #include "avcodec.h" |
| 42 #include "dsputil.h" | |
| 6450 | 43 #include "bitstream.h" |
| 723 | 44 #include "simple_idct.h" |
|
1489
337d13aee605
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
1416
diff
changeset
|
45 #include "dvdata.h" |
| 723 | 46 |
| 2847 | 47 //#undef NDEBUG |
| 48 //#include <assert.h> | |
| 49 | |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
50 typedef struct DVVideoContext { |
| 8051 | 51 const DVprofile *sys; |
| 52 AVFrame picture; | |
| 53 AVCodecContext *avctx; | |
| 54 uint8_t *buf; | |
| 2967 | 55 |
| 8051 | 56 uint8_t dv_zigzag[2][64]; |
| 2967 | 57 |
|
1489
337d13aee605
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
1416
diff
changeset
|
58 void (*get_pixels)(DCTELEM *block, const uint8_t *pixels, int line_size); |
| 1567 | 59 void (*fdct[2])(DCTELEM *block); |
| 60 void (*idct_put[2])(uint8_t *dest, int line_size, DCTELEM *block); | |
|
8979
5337b260a70d
transitioning dv_guess_dct_mode to dsputil cmp function
romansh
parents:
8954
diff
changeset
|
61 me_cmp_func ildct_cmp; |
|
3016
97e6c0f82182
Moving dv_anchor back to the global scope. This creates a tiny memory
romansh
parents:
2991
diff
changeset
|
62 } DVVideoContext; |
|
2991
d377b0788381
Fix DV memory leak and allow multiple instances patch by (Burkhard Plaum?)
michael
parents:
2979
diff
changeset
|
63 |
|
1489
337d13aee605
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
1416
diff
changeset
|
64 #define TEX_VLC_BITS 9 |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
65 |
|
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
66 #if CONFIG_SMALL |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
67 #define DV_VLC_MAP_RUN_SIZE 15 |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
68 #define DV_VLC_MAP_LEV_SIZE 23 |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
69 #else |
| 2967 | 70 #define DV_VLC_MAP_RUN_SIZE 64 |
| 2847 | 71 #define DV_VLC_MAP_LEV_SIZE 512 //FIXME sign was removed so this should be /2 but needs check |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
72 #endif |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
73 |
| 723 | 74 /* XXX: also include quantization */ |
| 4661 | 75 static RL_VLC_ELEM dv_rl_vlc[1184]; |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
76 /* VLC encoding lookup table */ |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
77 static struct dv_vlc_pair { |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
78 uint32_t vlc; |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
79 uint8_t size; |
| 4666 | 80 } dv_vlc_map[DV_VLC_MAP_RUN_SIZE][DV_VLC_MAP_LEV_SIZE]; |
| 723 | 81 |
|
8118
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
82 static inline int dv_work_pool_size(const DVprofile *d) |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
83 { |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
84 int size = d->n_difchan*d->difseg_size*27; |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
85 if (DV_PROFILE_IS_1080i50(d)) |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
86 size -= 3*27; |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
87 if (DV_PROFILE_IS_720p50(d)) |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
88 size -= 4*27; |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
89 return size; |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
90 } |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
91 |
| 8164 | 92 static inline void dv_calc_mb_coordinates(const DVprofile *d, int chan, int seq, int slot, |
| 93 uint16_t *tbl) | |
| 94 { | |
|
8954
409d20e15da8
cosmetics: 'const static' --> 'static const' to avoid warnings of the type
diego
parents:
8738
diff
changeset
|
95 static const uint8_t off[] = { 2, 6, 8, 0, 4 }; |
|
409d20e15da8
cosmetics: 'const static' --> 'static const' to avoid warnings of the type
diego
parents:
8738
diff
changeset
|
96 static const uint8_t shuf1[] = { 36, 18, 54, 0, 72 }; |
|
409d20e15da8
cosmetics: 'const static' --> 'static const' to avoid warnings of the type
diego
parents:
8738
diff
changeset
|
97 static const uint8_t shuf2[] = { 24, 12, 36, 0, 48 }; |
|
409d20e15da8
cosmetics: 'const static' --> 'static const' to avoid warnings of the type
diego
parents:
8738
diff
changeset
|
98 static const uint8_t shuf3[] = { 18, 9, 27, 0, 36 }; |
| 8164 | 99 |
|
8954
409d20e15da8
cosmetics: 'const static' --> 'static const' to avoid warnings of the type
diego
parents:
8738
diff
changeset
|
100 static const uint8_t l_start[] = {0, 4, 9, 13, 18, 22, 27, 31, 36, 40}; |
|
409d20e15da8
cosmetics: 'const static' --> 'static const' to avoid warnings of the type
diego
parents:
8738
diff
changeset
|
101 static const uint8_t l_start_shuffled[] = { 9, 4, 13, 0, 18 }; |
| 8164 | 102 |
|
8954
409d20e15da8
cosmetics: 'const static' --> 'static const' to avoid warnings of the type
diego
parents:
8738
diff
changeset
|
103 static const uint8_t serpent1[] = {0, 1, 2, 2, 1, 0, |
| 8164 | 104 0, 1, 2, 2, 1, 0, |
| 105 0, 1, 2, 2, 1, 0, | |
| 106 0, 1, 2, 2, 1, 0, | |
| 107 0, 1, 2}; | |
|
8954
409d20e15da8
cosmetics: 'const static' --> 'static const' to avoid warnings of the type
diego
parents:
8738
diff
changeset
|
108 static const uint8_t serpent2[] = {0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0, |
| 8164 | 109 0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0, |
| 110 0, 1, 2, 3, 4, 5}; | |
| 111 | |
|
8954
409d20e15da8
cosmetics: 'const static' --> 'static const' to avoid warnings of the type
diego
parents:
8738
diff
changeset
|
112 static const uint8_t remap[][2] = {{ 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, /* dummy */ |
| 8164 | 113 { 0, 0}, { 0, 1}, { 0, 2}, { 0, 3}, {10, 0}, |
| 114 {10, 1}, {10, 2}, {10, 3}, {20, 0}, {20, 1}, | |
| 115 {20, 2}, {20, 3}, {30, 0}, {30, 1}, {30, 2}, | |
| 116 {30, 3}, {40, 0}, {40, 1}, {40, 2}, {40, 3}, | |
| 117 {50, 0}, {50, 1}, {50, 2}, {50, 3}, {60, 0}, | |
| 118 {60, 1}, {60, 2}, {60, 3}, {70, 0}, {70, 1}, | |
| 119 {70, 2}, {70, 3}, { 0,64}, { 0,65}, { 0,66}, | |
| 120 {10,64}, {10,65}, {10,66}, {20,64}, {20,65}, | |
| 121 {20,66}, {30,64}, {30,65}, {30,66}, {40,64}, | |
| 122 {40,65}, {40,66}, {50,64}, {50,65}, {50,66}, | |
| 123 {60,64}, {60,65}, {60,66}, {70,64}, {70,65}, | |
| 124 {70,66}, { 0,67}, {20,67}, {40,67}, {60,67}}; | |
| 125 | |
| 126 int i, k, m; | |
| 127 int x, y, blk; | |
| 128 | |
| 129 for (m=0; m<5; m++) { | |
| 130 switch (d->width) { | |
| 131 case 1440: | |
| 132 blk = (chan*11+seq)*27+slot; | |
| 133 | |
| 134 if (chan == 0 && seq == 11) { | |
| 135 x = m*27+slot; | |
| 136 if (x<90) { | |
| 137 y = 0; | |
| 138 } else { | |
| 139 x = (x - 90)*2; | |
| 140 y = 67; | |
| 141 } | |
| 142 } else { | |
| 143 i = (4*chan + blk + off[m])%11; | |
| 144 k = (blk/11)%27; | |
| 145 | |
| 146 x = shuf1[m] + (chan&1)*9 + k%9; | |
| 147 y = (i*3+k/9)*2 + (chan>>1) + 1; | |
| 148 } | |
| 149 tbl[m] = (x<<1)|(y<<9); | |
| 150 break; | |
| 151 case 1280: | |
| 152 blk = (chan*10+seq)*27+slot; | |
| 153 | |
| 154 i = (4*chan + (seq/5) + 2*blk + off[m])%10; | |
| 155 k = (blk/5)%27; | |
| 156 | |
| 157 x = shuf1[m]+(chan&1)*9 + k%9; | |
| 158 y = (i*3+k/9)*2 + (chan>>1) + 4; | |
| 159 | |
| 160 if (x >= 80) { | |
| 161 x = remap[y][0]+((x-80)<<(y>59)); | |
| 162 y = remap[y][1]; | |
| 163 } | |
| 164 tbl[m] = (x<<1)|(y<<9); | |
| 165 break; | |
| 166 case 960: | |
| 167 blk = (chan*10+seq)*27+slot; | |
| 168 | |
| 169 i = (4*chan + (seq/5) + 2*blk + off[m])%10; | |
| 170 k = (blk/5)%27 + (i&1)*3; | |
| 171 | |
| 172 x = shuf2[m] + k%6 + 6*(chan&1); | |
| 173 y = l_start[i] + k/6 + 45*(chan>>1); | |
| 174 tbl[m] = (x<<1)|(y<<9); | |
| 175 break; | |
| 176 case 720: | |
| 177 switch (d->pix_fmt) { | |
| 178 case PIX_FMT_YUV422P: | |
| 179 x = shuf3[m] + slot/3; | |
| 180 y = serpent1[slot] + | |
| 181 ((((seq + off[m]) % d->difseg_size)<<1) + chan)*3; | |
| 182 tbl[m] = (x<<1)|(y<<8); | |
| 183 break; | |
| 184 case PIX_FMT_YUV420P: | |
| 185 x = shuf3[m] + slot/3; | |
| 186 y = serpent1[slot] + | |
| 187 ((seq + off[m]) % d->difseg_size)*3; | |
| 188 tbl[m] = (x<<1)|(y<<9); | |
| 189 break; | |
| 190 case PIX_FMT_YUV411P: | |
| 191 i = (seq + off[m]) % d->difseg_size; | |
| 192 k = slot + ((m==1||m==2)?3:0); | |
| 193 | |
| 194 x = l_start_shuffled[m] + k/6; | |
| 195 y = serpent2[k] + i*6; | |
| 196 if (x>21) | |
| 197 y = y*2 - i*6; | |
| 198 tbl[m] = (x<<2)|(y<<8); | |
| 199 break; | |
| 200 } | |
| 201 default: | |
| 202 break; | |
| 203 } | |
| 204 } | |
| 205 } | |
| 206 | |
|
8118
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
207 static int dv_init_dynamic_tables(const DVprofile *d) |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
208 { |
| 8164 | 209 int j,i,c,s,p; |
| 8175 | 210 uint32_t *factor1, *factor2; |
| 211 const int *iweight1, *iweight2; | |
|
8118
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
212 |
| 8173 | 213 if (!d->work_chunks[dv_work_pool_size(d)-1].buf_offset) { |
| 214 p = i = 0; | |
| 215 for (c=0; c<d->n_difchan; c++) { | |
| 216 for (s=0; s<d->difseg_size; s++) { | |
| 217 p += 6; | |
| 218 for (j=0; j<27; j++) { | |
| 219 p += !(j%3); | |
| 220 if (!(DV_PROFILE_IS_1080i50(d) && c != 0 && s == 11) && | |
| 221 !(DV_PROFILE_IS_720p50(d) && s > 9)) { | |
| 222 dv_calc_mb_coordinates(d, c, s, j, &d->work_chunks[i].mb_coordinates[0]); | |
| 223 d->work_chunks[i++].buf_offset = p; | |
| 224 } | |
| 225 p += 5; | |
| 226 } | |
|
8118
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
227 } |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
228 } |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
229 } |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
230 |
| 8175 | 231 if (!d->idct_factor[DV_PROFILE_IS_HD(d)?8191:5631]) { |
| 232 factor1 = &d->idct_factor[0]; | |
| 233 factor2 = &d->idct_factor[DV_PROFILE_IS_HD(d)?4096:2816]; | |
| 234 if (d->height == 720) { | |
| 235 iweight1 = &dv_iweight_720_y[0]; | |
| 236 iweight2 = &dv_iweight_720_c[0]; | |
| 237 } else { | |
| 238 iweight1 = &dv_iweight_1080_y[0]; | |
| 239 iweight2 = &dv_iweight_1080_c[0]; | |
| 240 } | |
| 241 if (DV_PROFILE_IS_HD(d)) { | |
| 242 for (c = 0; c < 4; c++) { | |
| 243 for (s = 0; s < 16; s++) { | |
| 244 for (i = 0; i < 64; i++) { | |
| 245 *factor1++ = (dv100_qstep[s] << (c + 9)) * iweight1[i]; | |
| 246 *factor2++ = (dv100_qstep[s] << (c + 9)) * iweight2[i]; | |
| 247 } | |
| 248 } | |
| 249 } | |
| 250 } else { | |
| 251 iweight1 = &dv_iweight_88[0]; | |
| 252 for (j = 0; j < 2; j++, iweight1 = &dv_iweight_248[0]) { | |
| 253 for (s = 0; s < 22; s++) { | |
| 254 for (i = c = 0; c < 4; c++) { | |
| 255 for (; i < dv_quant_areas[c]; i++) { | |
| 256 *factor1 = iweight1[i] << (dv_quant_shifts[s][c] + 1); | |
| 257 *factor2++ = (*factor1++) << 1; | |
| 258 } | |
| 259 } | |
|
7536
910087e97750
Coalescing the un-weighting and de-quantization steps for faster
romansh
parents:
7240
diff
changeset
|
260 } |
| 723 | 261 } |
| 262 } | |
| 8175 | 263 } |
|
7715
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
264 |
| 8175 | 265 return 0; |
| 723 | 266 } |
| 267 | |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6450
diff
changeset
|
268 static av_cold int dvvideo_init(AVCodecContext *avctx) |
| 723 | 269 { |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
270 DVVideoContext *s = avctx->priv_data; |
| 1567 | 271 DSPContext dsp; |
| 8051 | 272 static int done = 0; |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
273 int i, j; |
| 723 | 274 |
| 275 if (!done) { | |
|
1489
337d13aee605
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
1416
diff
changeset
|
276 VLC dv_vlc; |
|
1905
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
277 uint16_t new_dv_vlc_bits[NB_DV_VLC*2]; |
| 8051 | 278 uint8_t new_dv_vlc_len[NB_DV_VLC*2]; |
| 279 uint8_t new_dv_vlc_run[NB_DV_VLC*2]; | |
| 280 int16_t new_dv_vlc_level[NB_DV_VLC*2]; | |
| 723 | 281 |
| 282 done = 1; | |
| 283 | |
| 2979 | 284 /* it's faster to include sign bit in a generic VLC parsing scheme */ |
| 8051 | 285 for (i = 0, j = 0; i < NB_DV_VLC; i++, j++) { |
| 286 new_dv_vlc_bits[j] = dv_vlc_bits[i]; | |
| 287 new_dv_vlc_len[j] = dv_vlc_len[i]; | |
| 288 new_dv_vlc_run[j] = dv_vlc_run[i]; | |
| 2979 | 289 new_dv_vlc_level[j] = dv_vlc_level[i]; |
| 2967 | 290 |
| 2979 | 291 if (dv_vlc_level[i]) { |
| 292 new_dv_vlc_bits[j] <<= 1; | |
| 293 new_dv_vlc_len[j]++; | |
|
1905
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
294 |
| 2979 | 295 j++; |
| 8051 | 296 new_dv_vlc_bits[j] = (dv_vlc_bits[i] << 1) | 1; |
| 297 new_dv_vlc_len[j] = dv_vlc_len[i] + 1; | |
| 298 new_dv_vlc_run[j] = dv_vlc_run[i]; | |
| 2979 | 299 new_dv_vlc_level[j] = -dv_vlc_level[i]; |
| 300 } | |
| 301 } | |
| 2967 | 302 |
| 723 | 303 /* NOTE: as a trick, we use the fact the no codes are unused |
| 304 to accelerate the parsing of partial codes */ | |
| 2967 | 305 init_vlc(&dv_vlc, TEX_VLC_BITS, j, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2247
diff
changeset
|
306 new_dv_vlc_len, 1, 1, new_dv_vlc_bits, 2, 2, 0); |
| 4661 | 307 assert(dv_vlc.table_size == 1184); |
|
3016
97e6c0f82182
Moving dv_anchor back to the global scope. This creates a tiny memory
romansh
parents:
2991
diff
changeset
|
308 |
| 8051 | 309 for (i = 0; i < dv_vlc.table_size; i++){ |
| 310 int code = dv_vlc.table[i][0]; | |
| 311 int len = dv_vlc.table[i][1]; | |
| 723 | 312 int level, run; |
| 2967 | 313 |
| 8051 | 314 if (len < 0){ //more bits needed |
| 315 run = 0; | |
| 316 level = code; | |
| 723 | 317 } else { |
| 8051 | 318 run = new_dv_vlc_run [code] + 1; |
| 319 level = new_dv_vlc_level[code]; | |
| 723 | 320 } |
| 8051 | 321 dv_rl_vlc[i].len = len; |
|
1886
fbcf02596520
* DV decoder simplifications. Now it looks to be 6% faster. At least
romansh
parents:
1875
diff
changeset
|
322 dv_rl_vlc[i].level = level; |
| 8051 | 323 dv_rl_vlc[i].run = run; |
| 723 | 324 } |
| 2979 | 325 free_vlc(&dv_vlc); |
|
1489
337d13aee605
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
1416
diff
changeset
|
326 |
| 2979 | 327 for (i = 0; i < NB_DV_VLC - 1; i++) { |
|
2027
3a78447c3b53
oops, forgot to commit that change from the warning fixes by (Michael Roitzsch <mroi at users dot sourceforge dot net>)
michael
parents:
1994
diff
changeset
|
328 if (dv_vlc_run[i] >= DV_VLC_MAP_RUN_SIZE) |
| 2979 | 329 continue; |
|
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
330 #if CONFIG_SMALL |
|
2027
3a78447c3b53
oops, forgot to commit that change from the warning fixes by (Michael Roitzsch <mroi at users dot sourceforge dot net>)
michael
parents:
1994
diff
changeset
|
331 if (dv_vlc_level[i] >= DV_VLC_MAP_LEV_SIZE) |
| 2979 | 332 continue; |
|
2027
3a78447c3b53
oops, forgot to commit that change from the warning fixes by (Michael Roitzsch <mroi at users dot sourceforge dot net>)
michael
parents:
1994
diff
changeset
|
333 #endif |
| 2967 | 334 |
| 2979 | 335 if (dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size != 0) |
| 336 continue; | |
| 2967 | 337 |
| 8051 | 338 dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].vlc = |
| 339 dv_vlc_bits[i] << (!!dv_vlc_level[i]); | |
| 340 dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size = | |
| 341 dv_vlc_len[i] + (!!dv_vlc_level[i]); | |
| 2979 | 342 } |
| 343 for (i = 0; i < DV_VLC_MAP_RUN_SIZE; i++) { | |
|
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
344 #if CONFIG_SMALL |
| 2979 | 345 for (j = 1; j < DV_VLC_MAP_LEV_SIZE; j++) { |
| 346 if (dv_vlc_map[i][j].size == 0) { | |
| 347 dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc | | |
| 348 (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size)); | |
| 349 dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size + | |
| 350 dv_vlc_map[0][j].size; | |
| 351 } | |
| 352 } | |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
353 #else |
| 2979 | 354 for (j = 1; j < DV_VLC_MAP_LEV_SIZE/2; j++) { |
| 355 if (dv_vlc_map[i][j].size == 0) { | |
| 356 dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc | | |
| 357 (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size)); | |
| 358 dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size + | |
| 359 dv_vlc_map[0][j].size; | |
| 360 } | |
| 361 dv_vlc_map[i][((uint16_t)(-j))&0x1ff].vlc = | |
| 362 dv_vlc_map[i][j].vlc | 1; | |
| 363 dv_vlc_map[i][((uint16_t)(-j))&0x1ff].size = | |
| 364 dv_vlc_map[i][j].size; | |
| 365 } | |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
366 #endif |
| 2979 | 367 } |
| 723 | 368 } |
| 725 | 369 |
| 1567 | 370 /* Generic DSP setup */ |
| 371 dsputil_init(&dsp, avctx); | |
|
8979
5337b260a70d
transitioning dv_guess_dct_mode to dsputil cmp function
romansh
parents:
8954
diff
changeset
|
372 ff_set_cmp(&dsp, dsp.ildct_cmp, avctx->ildct_cmp); |
| 1567 | 373 s->get_pixels = dsp.get_pixels; |
|
8979
5337b260a70d
transitioning dv_guess_dct_mode to dsputil cmp function
romansh
parents:
8954
diff
changeset
|
374 s->ildct_cmp = dsp.ildct_cmp[5]; |
| 725 | 375 |
| 1567 | 376 /* 88DCT setup */ |
| 8051 | 377 s->fdct[0] = dsp.fdct; |
| 1567 | 378 s->idct_put[0] = dsp.idct_put; |
| 8051 | 379 for (i = 0; i < 64; i++) |
| 1567 | 380 s->dv_zigzag[0][i] = dsp.idct_permutation[ff_zigzag_direct[i]]; |
| 725 | 381 |
| 1567 | 382 /* 248DCT setup */ |
| 8051 | 383 s->fdct[1] = dsp.fdct248; |
| 6001 | 384 s->idct_put[1] = ff_simple_idct248_put; // FIXME: need to add it to DSP |
| 8051 | 385 if (avctx->lowres){ |
| 386 for (i = 0; i < 64; i++){ | |
| 387 int j = ff_zigzag248_direct[i]; | |
| 388 s->dv_zigzag[1][i] = dsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2]; | |
| 2849 | 389 } |
| 390 }else | |
| 391 memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64); | |
| 725 | 392 |
|
1543
7542cb99b950
* providing MPEG codecs with a generic fields in AVFrame to use.
romansh
parents:
1540
diff
changeset
|
393 avctx->coded_frame = &s->picture; |
| 8051 | 394 s->avctx = avctx; |
| 2967 | 395 |
| 723 | 396 return 0; |
| 397 } | |
| 398 | |
|
1489
337d13aee605
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
1416
diff
changeset
|
399 // #define VLC_DEBUG |
|
1905
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
400 // #define printf(...) av_log(NULL, AV_LOG_ERROR, __VA_ARGS__) |
| 723 | 401 |
| 725 | 402 typedef struct BlockInfo { |
|
7536
910087e97750
Coalescing the un-weighting and de-quantization steps for faster
romansh
parents:
7240
diff
changeset
|
403 const uint32_t *factor_table; |
| 1064 | 404 const uint8_t *scan_table; |
| 405 uint8_t pos; /* position in block */ | |
| 7706 | 406 void (*idct_put)(uint8_t *dest, int line_size, DCTELEM *block); |
| 1064 | 407 uint8_t partial_bit_count; |
| 408 uint16_t partial_bit_buffer; | |
| 725 | 409 int shift_offset; |
| 410 } BlockInfo; | |
| 723 | 411 |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
412 /* bit budget for AC only in 5 MBs */ |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
413 static const int vs_total_ac_bits = (100 * 4 + 68*2) * 5; |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
414 /* see dv_88_areas and dv_248_areas for details */ |
| 2967 | 415 static const int mb_area_start[5] = { 1, 6, 21, 43, 64 }; |
| 723 | 416 |
|
1895
e5687117cc7f
* removing casualties of battle of the wits and English language
romansh
parents:
1887
diff
changeset
|
417 static inline int get_bits_left(GetBitContext *s) |
|
e5687117cc7f
* removing casualties of battle of the wits and English language
romansh
parents:
1887
diff
changeset
|
418 { |
|
e5687117cc7f
* removing casualties of battle of the wits and English language
romansh
parents:
1887
diff
changeset
|
419 return s->size_in_bits - get_bits_count(s); |
|
e5687117cc7f
* removing casualties of battle of the wits and English language
romansh
parents:
1887
diff
changeset
|
420 } |
|
e5687117cc7f
* removing casualties of battle of the wits and English language
romansh
parents:
1887
diff
changeset
|
421 |
|
e5687117cc7f
* removing casualties of battle of the wits and English language
romansh
parents:
1887
diff
changeset
|
422 static inline int put_bits_left(PutBitContext* s) |
|
e5687117cc7f
* removing casualties of battle of the wits and English language
romansh
parents:
1887
diff
changeset
|
423 { |
|
e5687117cc7f
* removing casualties of battle of the wits and English language
romansh
parents:
1887
diff
changeset
|
424 return (s->buf_end - s->buf) * 8 - put_bits_count(s); |
|
e5687117cc7f
* removing casualties of battle of the wits and English language
romansh
parents:
1887
diff
changeset
|
425 } |
|
e5687117cc7f
* removing casualties of battle of the wits and English language
romansh
parents:
1887
diff
changeset
|
426 |
| 7980 | 427 /* decode ac coefficients */ |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
428 static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, DCTELEM *block) |
| 723 | 429 { |
| 7039 | 430 int last_index = gb->size_in_bits; |
| 8051 | 431 const uint8_t *scan_table = mb->scan_table; |
|
7536
910087e97750
Coalescing the un-weighting and de-quantization steps for faster
romansh
parents:
7240
diff
changeset
|
432 const uint32_t *factor_table = mb->factor_table; |
| 8051 | 433 int pos = mb->pos; |
|
1905
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
434 int partial_bit_count = mb->partial_bit_count; |
|
7536
910087e97750
Coalescing the un-weighting and de-quantization steps for faster
romansh
parents:
7240
diff
changeset
|
435 int level, run, vlc_len, index; |
| 2967 | 436 |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
437 OPEN_READER(re, gb); |
|
1905
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
438 UPDATE_CACHE(re, gb); |
| 2967 | 439 |
| 723 | 440 /* if we must parse a partial vlc, we do it here */ |
| 441 if (partial_bit_count > 0) { | |
|
1905
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
442 re_cache = ((unsigned)re_cache >> partial_bit_count) | |
| 8051 | 443 (mb->partial_bit_buffer << (sizeof(re_cache) * 8 - partial_bit_count)); |
| 2979 | 444 re_index -= partial_bit_count; |
| 445 mb->partial_bit_count = 0; | |
| 723 | 446 } |
| 447 | |
| 448 /* get the AC coefficients until last_index is reached */ | |
| 8051 | 449 for (;;) { |
| 723 | 450 #ifdef VLC_DEBUG |
|
1905
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
451 printf("%2d: bits=%04x index=%d\n", pos, SHOW_UBITS(re, gb, 16), re_index); |
| 723 | 452 #endif |
|
1905
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
453 /* our own optimized GET_RL_VLC */ |
| 8051 | 454 index = NEG_USR32(re_cache, TEX_VLC_BITS); |
| 2979 | 455 vlc_len = dv_rl_vlc[index].len; |
|
1905
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
456 if (vlc_len < 0) { |
|
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
457 index = NEG_USR32((unsigned)re_cache << TEX_VLC_BITS, -vlc_len) + dv_rl_vlc[index].level; |
|
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
458 vlc_len = TEX_VLC_BITS - vlc_len; |
|
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
459 } |
|
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
460 level = dv_rl_vlc[index].level; |
| 8051 | 461 run = dv_rl_vlc[index].run; |
| 2967 | 462 |
| 2979 | 463 /* gotta check if we're still within gb boundaries */ |
| 464 if (re_index + vlc_len > last_index) { | |
| 465 /* should be < 16 bits otherwise a codeword could have been parsed */ | |
| 466 mb->partial_bit_count = last_index - re_index; | |
| 467 mb->partial_bit_buffer = NEG_USR32(re_cache, mb->partial_bit_count); | |
| 468 re_index = last_index; | |
| 469 break; | |
| 470 } | |
| 471 re_index += vlc_len; | |
|
1905
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
472 |
|
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
473 #ifdef VLC_DEBUG |
| 2979 | 474 printf("run=%d level=%d\n", run, level); |
|
1905
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
475 #endif |
| 2979 | 476 pos += run; |
| 477 if (pos >= 64) | |
| 478 break; | |
| 2967 | 479 |
| 8051 | 480 level = (level * factor_table[pos] + (1 << (dv_iweight_bits - 1))) >> dv_iweight_bits; |
|
7536
910087e97750
Coalescing the un-weighting and de-quantization steps for faster
romansh
parents:
7240
diff
changeset
|
481 block[scan_table[pos]] = level; |
|
1905
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
482 |
|
2761950695cc
* some significant clean-up of the dv_decode_ac (it looks real
romansh
parents:
1904
diff
changeset
|
483 UPDATE_CACHE(re, gb); |
| 723 | 484 } |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
485 CLOSE_READER(re, gb); |
| 725 | 486 mb->pos = pos; |
| 723 | 487 } |
| 488 | |
|
1886
fbcf02596520
* DV decoder simplifications. Now it looks to be 6% faster. At least
romansh
parents:
1875
diff
changeset
|
489 static inline void bit_copy(PutBitContext *pb, GetBitContext *gb) |
| 723 | 490 { |
|
1886
fbcf02596520
* DV decoder simplifications. Now it looks to be 6% faster. At least
romansh
parents:
1875
diff
changeset
|
491 int bits_left = get_bits_left(gb); |
| 2847 | 492 while (bits_left >= MIN_CACHE_BITS) { |
| 493 put_bits(pb, MIN_CACHE_BITS, get_bits(gb, MIN_CACHE_BITS)); | |
| 494 bits_left -= MIN_CACHE_BITS; | |
| 723 | 495 } |
| 496 if (bits_left > 0) { | |
| 497 put_bits(pb, bits_left, get_bits(gb, bits_left)); | |
| 498 } | |
| 499 } | |
| 500 | |
| 8131 | 501 static inline void dv_calculate_mb_xy(DVVideoContext *s, DVwork_chunk *work_chunk, int m, int *mb_x, int *mb_y) |
|
8118
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
502 { |
| 8131 | 503 *mb_x = work_chunk->mb_coordinates[m] & 0xff; |
| 504 *mb_y = work_chunk->mb_coordinates[m] >> 8; | |
|
8118
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
505 |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
506 /* We work with 720p frames split in half. The odd half-frame (chan==2,3) is displaced :-( */ |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
507 if (s->sys->height == 720 && !(s->buf[1]&0x0C)) { |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
508 *mb_y -= (*mb_y>17)?18:-72; /* shifting the Y coordinate down by 72/2 macro blocks */ |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
509 } |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
510 } |
|
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
511 |
| 723 | 512 /* mb_x and mb_y are in units of 8 pixels */ |
| 8716 | 513 static int dv_decode_video_segment(AVCodecContext *avctx, void *arg) |
| 723 | 514 { |
| 8163 | 515 DVVideoContext *s = avctx->priv_data; |
| 8716 | 516 DVwork_chunk *work_chunk = arg; |
| 723 | 517 int quant, dc, dct_mode, class1, j; |
|
8118
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
518 int mb_index, mb_x, mb_y, last_index; |
| 8011 | 519 int y_stride, linesize; |
| 723 | 520 DCTELEM *block, *block1; |
|
1886
fbcf02596520
* DV decoder simplifications. Now it looks to be 6% faster. At least
romansh
parents:
1875
diff
changeset
|
521 int c_offset; |
| 1064 | 522 uint8_t *y_ptr; |
| 6266 | 523 const uint8_t *buf_ptr; |
| 723 | 524 PutBitContext pb, vs_pb; |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
525 GetBitContext gb; |
|
7614
1afa1171b7b2
Introducing DV_MAX_BPM macro instead of a hardcoded value for the
romansh
parents:
7538
diff
changeset
|
526 BlockInfo mb_data[5 * DV_MAX_BPM], *mb, *mb1; |
|
1afa1171b7b2
Introducing DV_MAX_BPM macro instead of a hardcoded value for the
romansh
parents:
7538
diff
changeset
|
527 DECLARE_ALIGNED_16(DCTELEM, sblock[5*DV_MAX_BPM][64]); |
| 3089 | 528 DECLARE_ALIGNED_8(uint8_t, mb_bit_buffer[80 + 4]); /* allow some slack */ |
| 529 DECLARE_ALIGNED_8(uint8_t, vs_bit_buffer[5 * 80 + 4]); /* allow some slack */ | |
| 8051 | 530 const int log2_blocksize = 3-s->avctx->lowres; |
|
7715
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
531 int is_field_mode[5]; |
| 2967 | 532 |
| 8051 | 533 assert((((int)mb_bit_buffer) & 7) == 0); |
| 534 assert((((int)vs_bit_buffer) & 7) == 0); | |
| 2967 | 535 |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
536 memset(sblock, 0, sizeof(sblock)); |
| 723 | 537 |
| 538 /* pass 1 : read DC and AC coefficients in blocks */ | |
| 8131 | 539 buf_ptr = &s->buf[work_chunk->buf_offset*80]; |
| 8051 | 540 block1 = &sblock[0][0]; |
| 541 mb1 = mb_data; | |
|
1522
79dddc5cd990
removed the obsolete and unused parameters of init_put_bits
alex
parents:
1507
diff
changeset
|
542 init_put_bits(&vs_pb, vs_bit_buffer, 5 * 80); |
| 8051 | 543 for (mb_index = 0; mb_index < 5; mb_index++, mb1 += s->sys->bpm, block1 += s->sys->bpm * 64) { |
| 723 | 544 /* skip header */ |
| 545 quant = buf_ptr[3] & 0x0f; | |
| 546 buf_ptr += 4; | |
|
1522
79dddc5cd990
removed the obsolete and unused parameters of init_put_bits
alex
parents:
1507
diff
changeset
|
547 init_put_bits(&pb, mb_bit_buffer, 80); |
| 8051 | 548 mb = mb1; |
| 723 | 549 block = block1; |
|
7715
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
550 is_field_mode[mb_index] = 0; |
| 8051 | 551 for (j = 0; j < s->sys->bpm; j++) { |
|
7616
685ef77c9fe5
Making block size in bits variable and dependent on the DV spec
romansh
parents:
7615
diff
changeset
|
552 last_index = s->sys->block_sizes[j]; |
| 2979 | 553 init_get_bits(&gb, buf_ptr, last_index); |
| 2967 | 554 |
| 723 | 555 /* get the dc */ |
| 8051 | 556 dc = get_sbits(&gb, 9); |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
557 dct_mode = get_bits1(&gb); |
| 8051 | 558 class1 = get_bits(&gb, 2); |
|
7715
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
559 if (DV_PROFILE_IS_HD(s->sys)) { |
| 8051 | 560 mb->idct_put = s->idct_put[0]; |
| 561 mb->scan_table = s->dv_zigzag[0]; | |
| 8175 | 562 mb->factor_table = &s->sys->idct_factor[(j >= 4)*4*16*64 + class1*16*64 + quant*64]; |
|
7715
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
563 is_field_mode[mb_index] |= !j && dct_mode; |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
564 } else { |
| 8051 | 565 mb->idct_put = s->idct_put[dct_mode && log2_blocksize == 3]; |
| 566 mb->scan_table = s->dv_zigzag[dct_mode]; | |
| 8175 | 567 mb->factor_table = &s->sys->idct_factor[(class1 == 3)*2*22*64 + dct_mode*22*64 + |
| 568 (quant + dv_quant_offset[class1])*64]; | |
|
7715
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
569 } |
| 723 | 570 dc = dc << 2; |
| 571 /* convert to unsigned because 128 is not added in the | |
| 572 standard IDCT */ | |
| 573 dc += 1024; | |
| 574 block[0] = dc; | |
| 575 buf_ptr += last_index >> 3; | |
| 8051 | 576 mb->pos = 0; |
| 725 | 577 mb->partial_bit_count = 0; |
| 723 | 578 |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
579 #ifdef VLC_DEBUG |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
580 printf("MB block: %d, %d ", mb_index, j); |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
581 #endif |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
582 dv_decode_ac(&gb, mb, block); |
| 723 | 583 |
| 584 /* write the remaining bits in a new buffer only if the | |
| 585 block is finished */ | |
|
1886
fbcf02596520
* DV decoder simplifications. Now it looks to be 6% faster. At least
romansh
parents:
1875
diff
changeset
|
586 if (mb->pos >= 64) |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
587 bit_copy(&pb, &gb); |
| 2967 | 588 |
| 723 | 589 block += 64; |
| 725 | 590 mb++; |
| 723 | 591 } |
| 2967 | 592 |
| 723 | 593 /* pass 2 : we can do it just after */ |
| 594 #ifdef VLC_DEBUG | |
|
1886
fbcf02596520
* DV decoder simplifications. Now it looks to be 6% faster. At least
romansh
parents:
1875
diff
changeset
|
595 printf("***pass 2 size=%d MB#=%d\n", put_bits_count(&pb), mb_index); |
| 723 | 596 #endif |
| 597 block = block1; | |
| 8051 | 598 mb = mb1; |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
599 init_get_bits(&gb, mb_bit_buffer, put_bits_count(&pb)); |
| 2979 | 600 flush_put_bits(&pb); |
| 8051 | 601 for (j = 0; j < s->sys->bpm; j++, block += 64, mb++) { |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
602 if (mb->pos < 64 && get_bits_left(&gb) > 0) { |
|
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
603 dv_decode_ac(&gb, mb, block); |
| 723 | 604 /* if still not finished, no need to parse other blocks */ |
|
1886
fbcf02596520
* DV decoder simplifications. Now it looks to be 6% faster. At least
romansh
parents:
1875
diff
changeset
|
605 if (mb->pos < 64) |
|
fbcf02596520
* DV decoder simplifications. Now it looks to be 6% faster. At least
romansh
parents:
1875
diff
changeset
|
606 break; |
| 723 | 607 } |
| 608 } | |
| 609 /* all blocks are finished, so the extra bytes can be used at | |
| 610 the video segment level */ | |
|
7615
290fd3ae1219
Making the number of blocks per macroblock dependent on the DV stream
romansh
parents:
7614
diff
changeset
|
611 if (j >= s->sys->bpm) |
| 2979 | 612 bit_copy(&vs_pb, &gb); |
| 723 | 613 } |
| 614 | |
| 615 /* we need a pass other the whole video segment */ | |
| 616 #ifdef VLC_DEBUG | |
|
1886
fbcf02596520
* DV decoder simplifications. Now it looks to be 6% faster. At least
romansh
parents:
1875
diff
changeset
|
617 printf("***pass 3 size=%d\n", put_bits_count(&vs_pb)); |
| 723 | 618 #endif |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
619 block = &sblock[0][0]; |
| 8051 | 620 mb = mb_data; |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
621 init_get_bits(&gb, vs_bit_buffer, put_bits_count(&vs_pb)); |
|
1886
fbcf02596520
* DV decoder simplifications. Now it looks to be 6% faster. At least
romansh
parents:
1875
diff
changeset
|
622 flush_put_bits(&vs_pb); |
| 8051 | 623 for (mb_index = 0; mb_index < 5; mb_index++) { |
| 624 for (j = 0; j < s->sys->bpm; j++) { | |
|
1886
fbcf02596520
* DV decoder simplifications. Now it looks to be 6% faster. At least
romansh
parents:
1875
diff
changeset
|
625 if (mb->pos < 64) { |
| 723 | 626 #ifdef VLC_DEBUG |
| 627 printf("start %d:%d\n", mb_index, j); | |
| 628 #endif | |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
629 dv_decode_ac(&gb, mb, block); |
| 723 | 630 } |
| 2979 | 631 if (mb->pos >= 64 && mb->pos < 127) |
| 632 av_log(NULL, AV_LOG_ERROR, "AC EOB marker is absent pos=%d\n", mb->pos); | |
| 723 | 633 block += 64; |
| 725 | 634 mb++; |
| 723 | 635 } |
| 636 } | |
| 2967 | 637 |
| 723 | 638 /* compute idct and place blocks */ |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
639 block = &sblock[0][0]; |
| 8051 | 640 mb = mb_data; |
| 641 for (mb_index = 0; mb_index < 5; mb_index++) { | |
|
8118
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
642 dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y); |
|
7715
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
643 |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
644 /* idct_put'ting luminance */ |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
645 if ((s->sys->pix_fmt == PIX_FMT_YUV420P) || |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
646 (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8)) || |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
647 (s->sys->height >= 720 && mb_y != 134)) { |
| 8051 | 648 y_stride = (s->picture.linesize[0] << ((!is_field_mode[mb_index]) * log2_blocksize)); |
|
7715
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
649 } else { |
| 8051 | 650 y_stride = (2 << log2_blocksize); |
|
7715
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
651 } |
| 8051 | 652 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x) << log2_blocksize); |
| 653 linesize = s->picture.linesize[0] << is_field_mode[mb_index]; | |
| 654 mb[0] .idct_put(y_ptr , linesize, block + 0*64); | |
| 8011 | 655 if (s->sys->video_stype == 4) { /* SD 422 */ |
| 8051 | 656 mb[2].idct_put(y_ptr + (1 << log2_blocksize) , linesize, block + 2*64); |
| 8011 | 657 } else { |
| 8051 | 658 mb[1].idct_put(y_ptr + (1 << log2_blocksize) , linesize, block + 1*64); |
| 659 mb[2].idct_put(y_ptr + y_stride, linesize, block + 2*64); | |
| 660 mb[3].idct_put(y_ptr + (1 << log2_blocksize) + y_stride, linesize, block + 3*64); | |
|
7715
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
661 } |
| 8011 | 662 mb += 4; |
| 663 block += 4*64; | |
|
7715
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
664 |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
665 /* idct_put'ting chrominance */ |
| 8051 | 666 c_offset = (((mb_y >> (s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] + |
| 667 (mb_x >> ((s->sys->pix_fmt == PIX_FMT_YUV411P) ? 2 : 1))) << log2_blocksize); | |
| 668 for (j = 2; j; j--) { | |
|
7715
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
669 uint8_t *c_ptr = s->picture.data[j] + c_offset; |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
670 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8)) { |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
671 uint64_t aligned_pixels[64/8]; |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
672 uint8_t *pixels = (uint8_t*)aligned_pixels; |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
673 uint8_t *c_ptr1, *ptr1; |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
674 int x, y; |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
675 mb->idct_put(pixels, 8, block); |
| 8051 | 676 for (y = 0; y < (1 << log2_blocksize); y++, c_ptr += s->picture.linesize[j], pixels += 8) { |
| 677 ptr1 = pixels + (1 << (log2_blocksize - 1)); | |
| 678 c_ptr1 = c_ptr + (s->picture.linesize[j] << log2_blocksize); | |
| 679 for (x = 0; x < (1 << (log2_blocksize - 1)); x++) { | |
| 680 c_ptr[x] = pixels[x]; | |
| 681 c_ptr1[x] = ptr1[x]; | |
|
7715
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
682 } |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
683 } |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
684 block += 64; mb++; |
|
e8f71784062e
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
7708
diff
changeset
|
685 } else { |
| 8051 | 686 y_stride = (mb_y == 134) ? (1 << log2_blocksize) : |
| 687 s->picture.linesize[j] << ((!is_field_mode[mb_index]) * log2_blocksize); | |
| 688 linesize = s->picture.linesize[j] << is_field_mode[mb_index]; | |
| 689 (mb++)-> idct_put(c_ptr , linesize, block); block += 64; | |
| 8011 | 690 if (s->sys->bpm == 8) { |
| 8051 | 691 (mb++)->idct_put(c_ptr + y_stride, linesize, block); block += 64; |
| 8011 | 692 } |
| 723 | 693 } |
| 694 } | |
| 695 } | |
| 8163 | 696 return 0; |
| 723 | 697 } |
| 698 | |
|
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
699 #if CONFIG_SMALL |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
700 /* Converts run and level (where level != 0) pair into vlc, returning bit size */ |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4001
diff
changeset
|
701 static av_always_inline int dv_rl2vlc(int run, int level, int sign, uint32_t* vlc) |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
702 { |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
703 int size; |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
704 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) { |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
705 *vlc = dv_vlc_map[run][level].vlc | sign; |
| 2979 | 706 size = dv_vlc_map[run][level].size; |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
707 } |
| 2967 | 708 else { |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
709 if (level < DV_VLC_MAP_LEV_SIZE) { |
| 2979 | 710 *vlc = dv_vlc_map[0][level].vlc | sign; |
| 711 size = dv_vlc_map[0][level].size; | |
| 712 } else { | |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
713 *vlc = 0xfe00 | (level << 1) | sign; |
| 2979 | 714 size = 16; |
| 715 } | |
| 716 if (run) { | |
| 717 *vlc |= ((run < 16) ? dv_vlc_map[run-1][0].vlc : | |
| 718 (0x1f80 | (run - 1))) << size; | |
| 8051 | 719 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13; |
| 2979 | 720 } |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
721 } |
| 2967 | 722 |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
723 return size; |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
724 } |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
725 |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4001
diff
changeset
|
726 static av_always_inline int dv_rl2vlc_size(int run, int level) |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
727 { |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
728 int size; |
| 2967 | 729 |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
730 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) { |
| 2979 | 731 size = dv_vlc_map[run][level].size; |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
732 } |
| 2967 | 733 else { |
| 2979 | 734 size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16; |
| 735 if (run) { | |
| 736 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13; | |
| 737 } | |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
738 } |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
739 return size; |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
740 } |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
741 #else |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4001
diff
changeset
|
742 static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t* vlc) |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
743 { |
| 2847 | 744 *vlc = dv_vlc_map[run][l].vlc | sign; |
| 745 return dv_vlc_map[run][l].size; | |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
746 } |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
747 |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4001
diff
changeset
|
748 static av_always_inline int dv_rl2vlc_size(int run, int l) |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
749 { |
| 2847 | 750 return dv_vlc_map[run][l].size; |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
751 } |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
752 #endif |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
753 |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
754 typedef struct EncBlockInfo { |
| 8051 | 755 int area_q[4]; |
| 756 int bit_size[4]; | |
| 757 int prev[5]; | |
| 758 int cur_ac; | |
| 759 int cno; | |
| 760 int dct_mode; | |
| 761 DCTELEM mb[64]; | |
| 762 uint8_t next[64]; | |
| 763 uint8_t sign[64]; | |
| 764 uint8_t partial_bit_count; | |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
765 uint32_t partial_bit_buffer; /* we can't use uint16_t here */ |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
766 } EncBlockInfo; |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
767 |
| 8051 | 768 static av_always_inline PutBitContext* dv_encode_ac(EncBlockInfo* bi, |
| 769 PutBitContext* pb_pool, | |
| 770 PutBitContext* pb_end) | |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
771 { |
| 8051 | 772 int prev, bits_left; |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
773 PutBitContext* pb = pb_pool; |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
774 int size = bi->partial_bit_count; |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
775 uint32_t vlc = bi->partial_bit_buffer; |
| 2847 | 776 |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
777 bi->partial_bit_count = bi->partial_bit_buffer = 0; |
| 8051 | 778 for (;;){ |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
779 /* Find suitable storage space */ |
|
1875
45a1592dadca
* moving some of the commonly used bit reading/writing functions
romansh
parents:
1726
diff
changeset
|
780 for (; size > (bits_left = put_bits_left(pb)); pb++) { |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
781 if (bits_left) { |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
782 size -= bits_left; |
| 2979 | 783 put_bits(pb, bits_left, vlc >> size); |
| 8051 | 784 vlc = vlc & ((1 << size) - 1); |
| 2979 | 785 } |
| 786 if (pb + 1 >= pb_end) { | |
| 8051 | 787 bi->partial_bit_count = size; |
| 2979 | 788 bi->partial_bit_buffer = vlc; |
| 789 return pb; | |
| 790 } | |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
791 } |
| 2967 | 792 |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
793 /* Store VLC */ |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
794 put_bits(pb, size, vlc); |
| 2967 | 795 |
| 8051 | 796 if (bi->cur_ac >= 64) |
| 2847 | 797 break; |
| 2967 | 798 |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
799 /* Construct the next VLC */ |
| 8051 | 800 prev = bi->cur_ac; |
| 2847 | 801 bi->cur_ac = bi->next[prev]; |
| 8051 | 802 if (bi->cur_ac < 64){ |
| 2847 | 803 size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac], bi->sign[bi->cur_ac], &vlc); |
| 804 } else { | |
| 805 size = 4; vlc = 6; /* End Of Block stamp */ | |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
806 } |
| 2847 | 807 } |
| 808 return pb; | |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
809 } |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
810 |
|
8979
5337b260a70d
transitioning dv_guess_dct_mode to dsputil cmp function
romansh
parents:
8954
diff
changeset
|
811 static av_always_inline int dv_guess_dct_mode(DVVideoContext *s, uint8_t *data, int linesize) { |
|
5337b260a70d
transitioning dv_guess_dct_mode to dsputil cmp function
romansh
parents:
8954
diff
changeset
|
812 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) { |
|
5337b260a70d
transitioning dv_guess_dct_mode to dsputil cmp function
romansh
parents:
8954
diff
changeset
|
813 int ps = s->ildct_cmp(NULL, data, NULL, linesize, 8) - 400; |
|
5337b260a70d
transitioning dv_guess_dct_mode to dsputil cmp function
romansh
parents:
8954
diff
changeset
|
814 if (ps > 0) { |
|
5337b260a70d
transitioning dv_guess_dct_mode to dsputil cmp function
romansh
parents:
8954
diff
changeset
|
815 int is = s->ildct_cmp(NULL, data , NULL, linesize<<1, 4) + |
|
5337b260a70d
transitioning dv_guess_dct_mode to dsputil cmp function
romansh
parents:
8954
diff
changeset
|
816 s->ildct_cmp(NULL, data + linesize, NULL, linesize<<1, 4); |
|
5337b260a70d
transitioning dv_guess_dct_mode to dsputil cmp function
romansh
parents:
8954
diff
changeset
|
817 return (ps > is); |
|
5337b260a70d
transitioning dv_guess_dct_mode to dsputil cmp function
romansh
parents:
8954
diff
changeset
|
818 } |
| 8990 | 819 } |
| 820 | |
| 821 return 0; | |
| 8703 | 822 } |
| 823 | |
| 8705 | 824 static av_always_inline int dv_init_enc_block(EncBlockInfo* bi, uint8_t *data, int linesize, DVVideoContext *s, int bias) |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
825 { |
| 8705 | 826 const int *weight; |
| 827 const uint8_t* zigzag_scan; | |
| 828 DECLARE_ALIGNED_16(DCTELEM, blk[64]); | |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
829 int i, area; |
|
3152
28a087ad41d1
Assign class 2 to most macroblocks by default, instead of a more conservative
romansh
parents:
3150
diff
changeset
|
830 /* We offer two different methods for class number assignment: the |
|
28a087ad41d1
Assign class 2 to most macroblocks by default, instead of a more conservative
romansh
parents:
3150
diff
changeset
|
831 method suggested in SMPTE 314M Table 22, and an improved |
|
28a087ad41d1
Assign class 2 to most macroblocks by default, instead of a more conservative
romansh
parents:
3150
diff
changeset
|
832 method. The SMPTE method is very conservative; it assigns class |
|
28a087ad41d1
Assign class 2 to most macroblocks by default, instead of a more conservative
romansh
parents:
3150
diff
changeset
|
833 3 (i.e. severe quantization) to any block where the largest AC |
| 7980 | 834 component is greater than 36. FFmpeg's DV encoder tracks AC bit |
|
3152
28a087ad41d1
Assign class 2 to most macroblocks by default, instead of a more conservative
romansh
parents:
3150
diff
changeset
|
835 consumption precisely, so there is no need to bias most blocks |
|
28a087ad41d1
Assign class 2 to most macroblocks by default, instead of a more conservative
romansh
parents:
3150
diff
changeset
|
836 towards strongly lossy compression. Instead, we assign class 2 |
|
28a087ad41d1
Assign class 2 to most macroblocks by default, instead of a more conservative
romansh
parents:
3150
diff
changeset
|
837 to most blocks, and use class 3 only when strictly necessary |
|
28a087ad41d1
Assign class 2 to most macroblocks by default, instead of a more conservative
romansh
parents:
3150
diff
changeset
|
838 (for blocks whose largest AC component exceeds 255). */ |
|
28a087ad41d1
Assign class 2 to most macroblocks by default, instead of a more conservative
romansh
parents:
3150
diff
changeset
|
839 |
|
28a087ad41d1
Assign class 2 to most macroblocks by default, instead of a more conservative
romansh
parents:
3150
diff
changeset
|
840 #if 0 /* SMPTE spec method */ |
| 2847 | 841 static const int classes[] = {12, 24, 36, 0xffff}; |
| 7980 | 842 #else /* improved FFmpeg method */ |
|
3152
28a087ad41d1
Assign class 2 to most macroblocks by default, instead of a more conservative
romansh
parents:
3150
diff
changeset
|
843 static const int classes[] = {-1, -1, 255, 0xffff}; |
|
28a087ad41d1
Assign class 2 to most macroblocks by default, instead of a more conservative
romansh
parents:
3150
diff
changeset
|
844 #endif |
| 8051 | 845 int max = classes[0]; |
| 846 int prev = 0; | |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
847 |
| 8705 | 848 assert((((int)blk) & 15) == 0); |
| 849 | |
| 850 bi->area_q[0] = bi->area_q[1] = bi->area_q[2] = bi->area_q[3] = 0; | |
| 851 bi->partial_bit_count = 0; | |
| 852 bi->partial_bit_buffer = 0; | |
| 853 bi->cur_ac = 0; | |
| 854 if (data) { | |
|
8979
5337b260a70d
transitioning dv_guess_dct_mode to dsputil cmp function
romansh
parents:
8954
diff
changeset
|
855 bi->dct_mode = dv_guess_dct_mode(s, data, linesize); |
| 8705 | 856 s->get_pixels(blk, data, linesize); |
| 857 s->fdct[bi->dct_mode](blk); | |
| 858 } else { | |
| 859 /* We rely on the fact that encoding all zeros leads to an immediate EOB, | |
| 860 which is precisely what the spec calls for in the "dummy" blocks. */ | |
| 861 memset(blk, 0, sizeof(blk)); | |
| 862 bi->dct_mode = 0; | |
| 863 } | |
| 2967 | 864 bi->mb[0] = blk[0]; |
| 865 | |
| 8705 | 866 zigzag_scan = bi->dct_mode ? ff_zigzag248_direct : ff_zigzag_direct; |
| 867 weight = bi->dct_mode ? dv_weight_248 : dv_weight_88; | |
| 868 | |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
869 for (area = 0; area < 4; area++) { |
| 8051 | 870 bi->prev[area] = prev; |
| 2847 | 871 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :) |
| 8051 | 872 for (i = mb_area_start[area]; i < mb_area_start[area+1]; i++) { |
| 2847 | 873 int level = blk[zigzag_scan[i]]; |
| 2967 | 874 |
| 8051 | 875 if (level + 15 > 30U) { |
| 876 bi->sign[i] = (level >> 31) & 1; | |
|
3149
2679184e8be0
AC coefficient weighing (per SMPTE 314M) for the DV encoder and decoder. The
romansh
parents:
3148
diff
changeset
|
877 /* weigh it and and shift down into range, adding for rounding */ |
|
2679184e8be0
AC coefficient weighing (per SMPTE 314M) for the DV encoder and decoder. The
romansh
parents:
3148
diff
changeset
|
878 /* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT |
|
2679184e8be0
AC coefficient weighing (per SMPTE 314M) for the DV encoder and decoder. The
romansh
parents:
3148
diff
changeset
|
879 AND the 2x doubling of the weights */ |
| 8051 | 880 level = (FFABS(level) * weight[i] + (1 << (dv_weight_bits+3))) >> (dv_weight_bits+4); |
|
3149
2679184e8be0
AC coefficient weighing (per SMPTE 314M) for the DV encoder and decoder. The
romansh
parents:
3148
diff
changeset
|
881 bi->mb[i] = level; |
| 8051 | 882 if (level > max) |
| 883 max = level; | |
| 2847 | 884 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level); |
| 885 bi->next[prev]= i; | |
| 8051 | 886 prev = i; |
| 2847 | 887 } |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
888 } |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
889 } |
| 2847 | 890 bi->next[prev]= i; |
| 8051 | 891 for (bi->cno = 0; max > classes[bi->cno]; bi->cno++); |
| 2847 | 892 |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
893 bi->cno += bias; |
| 2967 | 894 |
| 2847 | 895 if (bi->cno >= 3) { |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
896 bi->cno = 3; |
| 8051 | 897 prev = 0; |
| 898 i = bi->next[prev]; | |
| 2847 | 899 for (area = 0; area < 4; area++) { |
| 8051 | 900 bi->prev[area] = prev; |
| 2847 | 901 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :) |
| 8051 | 902 for (; i < mb_area_start[area+1]; i = bi->next[i]) { |
| 903 bi->mb[i] >>= 1; | |
| 2967 | 904 |
| 2847 | 905 if (bi->mb[i]) { |
| 906 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]); | |
| 907 bi->next[prev]= i; | |
| 8051 | 908 prev = i; |
| 2847 | 909 } |
| 910 } | |
| 911 } | |
| 912 bi->next[prev]= i; | |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
913 } |
| 8705 | 914 |
| 915 return bi->bit_size[0] + bi->bit_size[1] + bi->bit_size[2] + bi->bit_size[3]; | |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
916 } |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
917 |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
918 static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos) |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
919 { |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
920 int size[5]; |
| 3140 | 921 int i, j, k, a, prev, a2; |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
922 EncBlockInfo* b; |
| 2847 | 923 |
| 8051 | 924 size[0] = size[1] = size[2] = size[3] = size[4] = 1 << 24; |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
925 do { |
|
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
926 b = blks; |
| 8051 | 927 for (i = 0; i < 5; i++) { |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
928 if (!qnos[i]) |
| 2979 | 929 continue; |
| 2967 | 930 |
| 2979 | 931 qnos[i]--; |
| 932 size[i] = 0; | |
| 8051 | 933 for (j = 0; j < 6; j++, b++) { |
| 934 for (a = 0; a < 4; a++) { | |
| 2979 | 935 if (b->area_q[a] != dv_quant_shifts[qnos[i] + dv_quant_offset[b->cno]][a]) { |
| 936 b->bit_size[a] = 1; // 4 areas 4 bits for EOB :) | |
| 937 b->area_q[a]++; | |
| 8051 | 938 prev = b->prev[a]; |
| 3147 | 939 assert(b->next[prev] >= mb_area_start[a+1] || b->mb[prev]); |
| 8051 | 940 for (k = b->next[prev] ; k < mb_area_start[a+1]; k = b->next[k]) { |
| 2979 | 941 b->mb[k] >>= 1; |
| 942 if (b->mb[k]) { | |
| 2847 | 943 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]); |
| 8051 | 944 prev = k; |
| 2847 | 945 } else { |
| 8051 | 946 if (b->next[k] >= mb_area_start[a+1] && b->next[k]<64){ |
| 947 for (a2 = a + 1; b->next[k] >= mb_area_start[a2+1]; a2++) | |
|
3146
dcae1bde37ac
size[0-3] are not initialized (and can get random negative trash
michael
parents:
3143
diff
changeset
|
948 b->prev[a2] = prev; |
| 8051 | 949 assert(a2 < 4); |
| 3140 | 950 assert(b->mb[b->next[k]]); |
| 951 b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]]) | |
| 952 -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]); | |
| 8051 | 953 assert(b->prev[a2] == k && (a2 + 1 >= 4 || b->prev[a2+1] != k)); |
| 3147 | 954 b->prev[a2] = prev; |
| 3140 | 955 } |
| 2847 | 956 b->next[prev] = b->next[k]; |
| 957 } | |
| 2979 | 958 } |
| 2847 | 959 b->prev[a+1]= prev; |
| 2979 | 960 } |
| 961 size[i] += b->bit_size[a]; | |
| 962 } | |
| 963 } | |
| 8051 | 964 if (vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4]) |
| 3142 | 965 return; |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
966 } |
| 3140 | 967 } while (qnos[0]|qnos[1]|qnos[2]|qnos[3]|qnos[4]); |
| 968 | |
| 969 | |
| 8051 | 970 for (a = 2; a == 2 || vs_total_ac_bits < size[0]; a += a){ |
| 3140 | 971 b = blks; |
| 8051 | 972 size[0] = 5 * 6 * 4; //EOB |
| 973 for (j = 0; j < 6 *5; j++, b++) { | |
| 974 prev = b->prev[0]; | |
| 975 for (k = b->next[prev]; k < 64; k = b->next[k]) { | |
| 976 if (b->mb[k] < a && b->mb[k] > -a){ | |
| 3140 | 977 b->next[prev] = b->next[k]; |
| 978 }else{ | |
| 979 size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]); | |
| 8051 | 980 prev = k; |
| 3140 | 981 } |
| 982 } | |
| 983 } | |
| 984 } | |
| 1567 | 985 } |
| 986 | |
| 8716 | 987 static int dv_encode_video_segment(AVCodecContext *avctx, void *arg) |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
988 { |
| 8163 | 989 DVVideoContext *s = avctx->priv_data; |
| 8716 | 990 DVwork_chunk *work_chunk = arg; |
|
8118
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
991 int mb_index, i, j; |
| 8709 | 992 int mb_x, mb_y, c_offset, linesize, y_stride; |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
993 uint8_t* y_ptr; |
|
8118
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
994 uint8_t* dif; |
| 8705 | 995 uint8_t scratch[64]; |
| 8702 | 996 EncBlockInfo enc_blks[5*DV_MAX_BPM]; |
| 997 PutBitContext pbs[5*DV_MAX_BPM]; | |
| 2967 | 998 PutBitContext* pb; |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
999 EncBlockInfo* enc_blk; |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
1000 int vs_bit_size = 0; |
| 8708 | 1001 int qnos[5] = {15, 15, 15, 15, 15}; /* No quantization */ |
| 8707 | 1002 int* qnosp = &qnos[0]; |
| 2967 | 1003 |
| 8131 | 1004 dif = &s->buf[work_chunk->buf_offset*80]; |
| 1567 | 1005 enc_blk = &enc_blks[0]; |
| 8051 | 1006 for (mb_index = 0; mb_index < 5; mb_index++) { |
|
8118
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
1007 dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y); |
| 8709 | 1008 |
| 1009 /* initializing luminance blocks */ | |
| 1010 if ((s->sys->pix_fmt == PIX_FMT_YUV420P) || | |
| 1011 (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8)) || | |
| 1012 (s->sys->height >= 720 && mb_y != 134)) { | |
| 1013 y_stride = s->picture.linesize[0] << 3; | |
| 1014 } else { | |
| 1015 y_stride = 16; | |
| 1016 } | |
| 8051 | 1017 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x) << 3); |
| 8709 | 1018 linesize = s->picture.linesize[0]; |
| 1019 | |
| 1020 if (s->sys->video_stype == 4) { /* SD 422 */ | |
| 1021 vs_bit_size += | |
| 1022 dv_init_enc_block(enc_blk+0, y_ptr , linesize, s, 0) + | |
| 1023 dv_init_enc_block(enc_blk+1, NULL , linesize, s, 0) + | |
| 1024 dv_init_enc_block(enc_blk+2, y_ptr + 8 , linesize, s, 0) + | |
| 1025 dv_init_enc_block(enc_blk+3, NULL , linesize, s, 0); | |
| 1026 } else { | |
| 1027 vs_bit_size += | |
| 1028 dv_init_enc_block(enc_blk+0, y_ptr , linesize, s, 0) + | |
| 1029 dv_init_enc_block(enc_blk+1, y_ptr + 8 , linesize, s, 0) + | |
| 1030 dv_init_enc_block(enc_blk+2, y_ptr + y_stride, linesize, s, 0) + | |
| 1031 dv_init_enc_block(enc_blk+3, y_ptr + 8 + y_stride, linesize, s, 0); | |
| 1032 } | |
| 1033 enc_blk += 4; | |
| 1034 | |
| 1035 /* initializing chrominance blocks */ | |
| 8051 | 1036 c_offset = (((mb_y >> (s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] + |
| 1037 (mb_x >> ((s->sys->pix_fmt == PIX_FMT_YUV411P) ? 2 : 1))) << 3); | |
| 8709 | 1038 for (j = 2; j; j--) { |
| 1039 uint8_t *c_ptr = s->picture.data[j] + c_offset; | |
| 1040 linesize = s->picture.linesize[j]; | |
| 1041 y_stride = (mb_y == 134) ? 8 : (s->picture.linesize[j] << 3); | |
| 8710 | 1042 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8)) { |
| 1043 uint8_t* d; | |
| 1044 uint8_t* b = scratch; | |
| 1045 for (i = 0; i < 8; i++) { | |
| 1046 d = c_ptr + (linesize << 3); | |
| 1047 b[0] = c_ptr[0]; b[1] = c_ptr[1]; b[2] = c_ptr[2]; b[3] = c_ptr[3]; | |
| 1048 b[4] = d[0]; b[5] = d[1]; b[6] = d[2]; b[7] = d[3]; | |
| 1049 c_ptr += linesize; | |
| 1050 b += 8; | |
| 1051 } | |
| 1052 c_ptr = scratch; | |
| 1053 linesize = 8; | |
| 1054 } | |
| 8709 | 1055 |
| 1056 vs_bit_size += dv_init_enc_block( enc_blk++, c_ptr , linesize, s, 1); | |
| 1057 if (s->sys->bpm == 8) { | |
| 1058 vs_bit_size += dv_init_enc_block(enc_blk++, c_ptr + y_stride, linesize, s, 1); | |
| 2979 | 1059 } |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1060 } |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1061 } |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1062 |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
1063 if (vs_total_ac_bits < vs_bit_size) |
| 8707 | 1064 dv_guess_qnos(&enc_blks[0], qnosp); |
| 1065 | |
| 1066 /* DIF encoding process */ | |
| 1067 for (j=0; j<5*s->sys->bpm;) { | |
| 1068 int start_mb = j; | |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
1069 |
| 8707 | 1070 dif[3] = *qnosp++; |
| 1071 dif += 4; | |
| 1072 | |
| 1073 /* First pass over individual cells only */ | |
| 1074 for (i=0; i<s->sys->bpm; i++, j++) { | |
| 1075 int sz = s->sys->block_sizes[i]>>3; | |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1076 |
| 8707 | 1077 init_put_bits(&pbs[j], dif, sz); |
| 1078 put_bits(&pbs[j], 9, (uint16_t)(((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2)); | |
| 1079 put_bits(&pbs[j], 1, enc_blks[j].dct_mode); | |
| 1080 put_bits(&pbs[j], 2, enc_blks[j].cno); | |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1081 |
| 8707 | 1082 dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]); |
| 1083 dif += sz; | |
| 1084 } | |
| 1085 | |
| 1086 /* Second pass over each MB space */ | |
| 1087 pb = &pbs[start_mb]; | |
| 8702 | 1088 for (i=0; i<s->sys->bpm; i++) { |
| 8707 | 1089 if (enc_blks[start_mb+i].partial_bit_count) |
| 1090 pb = dv_encode_ac(&enc_blks[start_mb+i], pb, &pbs[start_mb+s->sys->bpm]); | |
| 2847 | 1091 } |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1092 } |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1093 |
| 8050 | 1094 /* Third and final pass over the whole video segment space */ |
| 8051 | 1095 pb = &pbs[0]; |
| 8702 | 1096 for (j=0; j<5*s->sys->bpm; j++) { |
| 2847 | 1097 if (enc_blks[j].partial_bit_count) |
| 8702 | 1098 pb = dv_encode_ac(&enc_blks[j], pb, &pbs[s->sys->bpm*5]); |
|
3139
e58fb7ffbb4f
print a big warning if we mess up and run out of space ...
michael
parents:
3089
diff
changeset
|
1099 if (enc_blks[j].partial_bit_count) |
|
e58fb7ffbb4f
print a big warning if we mess up and run out of space ...
michael
parents:
3089
diff
changeset
|
1100 av_log(NULL, AV_LOG_ERROR, "ac bitstream overflow\n"); |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1101 } |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
1102 |
| 8702 | 1103 for (j=0; j<5*s->sys->bpm; j++) |
|
1631
59f2fa833449
* 3x encoding speedup. Finally we seem to be on par with libdv
romansh
parents:
1598
diff
changeset
|
1104 flush_put_bits(&pbs[j]); |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1105 |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1106 return 0; |
|
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1107 } |
|
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1108 |
| 8590 | 1109 #if CONFIG_DVVIDEO_DECODER |
| 723 | 1110 /* NOTE: exactly one frame must be given (120000 bytes for NTSC, |
| 3167 | 1111 144000 bytes for PAL - or twice those for 50Mbps) */ |
| 2967 | 1112 static int dvvideo_decode_frame(AVCodecContext *avctx, |
| 723 | 1113 void *data, int *data_size, |
| 6218 | 1114 const uint8_t *buf, int buf_size) |
| 723 | 1115 { |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1116 DVVideoContext *s = avctx->priv_data; |
| 2967 | 1117 |
|
1489
337d13aee605
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
1416
diff
changeset
|
1118 s->sys = dv_frame_profile(buf); |
|
8118
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
1119 if (!s->sys || buf_size < s->sys->frame_size || dv_init_dynamic_tables(s->sys)) |
|
1489
337d13aee605
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
1416
diff
changeset
|
1120 return -1; /* NOTE: we only accept several full frames */ |
| 723 | 1121 |
| 8051 | 1122 if (s->picture.data[0]) |
| 1228 | 1123 avctx->release_buffer(avctx, &s->picture); |
| 2967 | 1124 |
|
1489
337d13aee605
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
1416
diff
changeset
|
1125 s->picture.reference = 0; |
|
2822
fdedaa2e6da4
DV video encoder/decoder doesn't set keyframe and picture type properties patch by (Edward Hervey:bilboed,gmail com)
michael
parents:
2661
diff
changeset
|
1126 s->picture.key_frame = 1; |
|
fdedaa2e6da4
DV video encoder/decoder doesn't set keyframe and picture type properties patch by (Edward Hervey:bilboed,gmail com)
michael
parents:
2661
diff
changeset
|
1127 s->picture.pict_type = FF_I_TYPE; |
| 8051 | 1128 avctx->pix_fmt = s->sys->pix_fmt; |
|
8014
07d8986fbea7
replacing frame_rate and frame_rate_base with an AVRational time_base
romansh
parents:
8011
diff
changeset
|
1129 avctx->time_base = s->sys->time_base; |
| 2849 | 1130 avcodec_set_dimensions(avctx, s->sys->width, s->sys->height); |
| 8051 | 1131 if (avctx->get_buffer(avctx, &s->picture) < 0) { |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1567
diff
changeset
|
1132 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
| 903 | 1133 return -1; |
| 835 | 1134 } |
|
1543
7542cb99b950
* providing MPEG codecs with a generic fields in AVFrame to use.
romansh
parents:
1540
diff
changeset
|
1135 s->picture.interlaced_frame = 1; |
| 8051 | 1136 s->picture.top_field_first = 0; |
| 835 | 1137 |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1138 s->buf = buf; |
| 8163 | 1139 avctx->execute(avctx, dv_decode_video_segment, s->sys->work_chunks, NULL, |
| 8131 | 1140 dv_work_pool_size(s->sys), sizeof(DVwork_chunk)); |
| 2967 | 1141 |
|
734
2d6b3e3d6c6f
10l - MMX/FPU state was not restored, causing nonsense fpu behaviour in caller (mplayer)
arpi_esp
parents:
733
diff
changeset
|
1142 emms_c(); |
|
2d6b3e3d6c6f
10l - MMX/FPU state was not restored, causing nonsense fpu behaviour in caller (mplayer)
arpi_esp
parents:
733
diff
changeset
|
1143 |
| 723 | 1144 /* return image */ |
| 925 | 1145 *data_size = sizeof(AVFrame); |
| 8051 | 1146 *(AVFrame*)data = s->picture; |
| 2967 | 1147 |
|
1489
337d13aee605
* DV handling was streamlined for both muxing/demuxing and
romansh
parents:
1416
diff
changeset
|
1148 return s->sys->frame_size; |
| 723 | 1149 } |
|
7776
dbcdd0165e55
Replace generic CONFIG_DECODERS preprocessor conditionals by more specific
diego
parents:
7715
diff
changeset
|
1150 #endif /* CONFIG_DVVIDEO_DECODER */ |
| 723 | 1151 |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1152 |
| 8051 | 1153 static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c, |
| 1154 uint8_t* buf) | |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1155 { |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1156 /* |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1157 * Here's what SMPTE314M says about these two: |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1158 * (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1159 * as track application IDs (APTn = 001, AP1n = |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1160 * 001, AP2n = 001, AP3n = 001), if the source signal |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1161 * comes from a digital VCR. If the signal source is |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1162 * unknown, all bits for these data shall be set to 1. |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1163 * (page 12) STYPE: STYPE defines a signal type of video signal |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1164 * 00000b = 4:1:1 compression |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1165 * 00100b = 4:2:2 compression |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1166 * XXXXXX = Reserved |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1167 * Now, I've got two problems with these statements: |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1168 * 1. it looks like APT == 111b should be a safe bet, but it isn't. |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1169 * It seems that for PAL as defined in IEC 61834 we have to set |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1170 * APT to 000 and for SMPTE314M to 001. |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1171 * 2. It is not at all clear what STYPE is used for 4:2:0 PAL |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1172 * compression scheme (if any). |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1173 */ |
| 8051 | 1174 int apt = (c->sys->pix_fmt == PIX_FMT_YUV420P ? 0 : 1); |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1175 |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1176 uint8_t aspect = 0; |
|
8714
ba1e52769fc5
assume widescreen when ratio also > 17, patch by Ben Hutchings, ben at decadent dot org dot uk
bcoudurier
parents:
8710
diff
changeset
|
1177 if ((int)(av_q2d(c->avctx->sample_aspect_ratio) * c->avctx->width / c->avctx->height * 10) >= 17) /* 16:9 */ |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1178 aspect = 0x02; |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1179 |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1180 buf[0] = (uint8_t)pack_id; |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1181 switch (pack_id) { |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1182 case dv_header525: /* I can't imagine why these two weren't defined as real */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1183 case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */ |
| 8051 | 1184 buf[1] = 0xf8 | /* reserved -- always 1 */ |
| 1185 (apt & 0x07); /* APT: Track application ID */ | |
| 1186 buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */ | |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1187 (0x0f << 3) | /* reserved -- always 1 */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1188 (apt & 0x07); /* AP1: Audio application ID */ |
| 8051 | 1189 buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */ |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1190 (0x0f << 3) | /* reserved -- always 1 */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1191 (apt & 0x07); /* AP2: Video application ID */ |
| 8051 | 1192 buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */ |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1193 (0x0f << 3) | /* reserved -- always 1 */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1194 (apt & 0x07); /* AP3: Subcode application ID */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1195 break; |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1196 case dv_video_source: |
| 8051 | 1197 buf[1] = 0xff; /* reserved -- always 1 */ |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1198 buf[2] = (1 << 7) | /* B/W: 0 - b/w, 1 - color */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1199 (1 << 6) | /* following CLF is valid - 0, invalid - 1 */ |
| 8050 | 1200 (3 << 4) | /* CLF: color frames ID (see ITU-R BT.470-4) */ |
| 8051 | 1201 0xf; /* reserved -- always 1 */ |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1202 buf[3] = (3 << 6) | /* reserved -- always 1 */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1203 (c->sys->dsf << 5) | /* system: 60fields/50fields */ |
| 8738 | 1204 c->sys->video_stype; /* signal type video compression */ |
| 8051 | 1205 buf[4] = 0xff; /* VISC: 0xff -- no information */ |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1206 break; |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1207 case dv_video_control: |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1208 buf[1] = (0 << 6) | /* Copy generation management (CGMS) 0 -- free */ |
| 8051 | 1209 0x3f; /* reserved -- always 1 */ |
| 1210 buf[2] = 0xc8 | /* reserved -- always b11001xxx */ | |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1211 aspect; |
| 8050 | 1212 buf[3] = (1 << 7) | /* frame/field flag 1 -- frame, 0 -- field */ |
| 1213 (1 << 6) | /* first/second field flag 0 -- field 2, 1 -- field 1 */ | |
| 1214 (1 << 5) | /* frame change flag 0 -- same picture as before, 1 -- different */ | |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1215 (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */ |
| 8051 | 1216 0xc; /* reserved -- always b1100 */ |
| 1217 buf[4] = 0xff; /* reserved -- always 1 */ | |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1218 break; |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1219 default: |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1220 buf[1] = buf[2] = buf[3] = buf[4] = 0xff; |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1221 } |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1222 return 5; |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1223 } |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1224 |
| 8590 | 1225 #if CONFIG_DVVIDEO_ENCODER |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1226 static void dv_format_frame(DVVideoContext* c, uint8_t* buf) |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1227 { |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1228 int chan, i, j, k; |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1229 |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1230 for (chan = 0; chan < c->sys->n_difchan; chan++) { |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1231 for (i = 0; i < c->sys->difseg_size; i++) { |
| 8050 | 1232 memset(buf, 0xff, 80 * 6); /* first 6 DIF blocks are for control data */ |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1233 |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1234 /* DV header: 1DIF */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1235 buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf); |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1236 buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525), c, buf); |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1237 buf += 72; /* unused bytes */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1238 |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1239 /* DV subcode: 2DIFs */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1240 for (j = 0; j < 2; j++) { |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1241 buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf); |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1242 for (k = 0; k < 6; k++) |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1243 buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size/2), buf) + 5; |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1244 buf += 29; /* unused bytes */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1245 } |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1246 |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1247 /* DV VAUX: 3DIFS */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1248 for (j = 0; j < 3; j++) { |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1249 buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf); |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1250 buf += dv_write_pack(dv_video_source, c, buf); |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1251 buf += dv_write_pack(dv_video_control, c, buf); |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1252 buf += 7*5; |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1253 buf += dv_write_pack(dv_video_source, c, buf); |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1254 buf += dv_write_pack(dv_video_control, c, buf); |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1255 buf += 4*5 + 2; /* unused bytes */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1256 } |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1257 |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1258 /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1259 for (j = 0; j < 135; j++) { |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1260 if (j%15 == 0) { |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1261 memset(buf, 0xff, 80); |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1262 buf += dv_write_dif_id(dv_sect_audio, chan, i, j/15, buf); |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1263 buf += 77; /* audio control & shuffled PCM audio */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1264 } |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1265 buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf); |
| 7980 | 1266 buf += 77; /* 1 video macroblock: 1 bytes control |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1267 4 * 14 bytes Y 8x8 data |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1268 10 bytes Cr 8x8 data |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1269 10 bytes Cb 8x8 data */ |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1270 } |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1271 } |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1272 } |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1273 } |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1274 |
|
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1275 |
| 2967 | 1276 static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size, |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1277 void *data) |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1278 { |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1279 DVVideoContext *s = c->priv_data; |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1280 |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1281 s->sys = dv_codec_profile(c); |
|
8118
890df98a7848
implementing more efficient (and direct) allocation of work for DV codec workers
romansh
parents:
8088
diff
changeset
|
1282 if (!s->sys || buf_size < s->sys->frame_size || dv_init_dynamic_tables(s->sys)) |
| 2422 | 1283 return -1; |
| 1284 | |
| 8051 | 1285 c->pix_fmt = s->sys->pix_fmt; |
| 1286 s->picture = *((AVFrame *)data); | |
|
2822
fdedaa2e6da4
DV video encoder/decoder doesn't set keyframe and picture type properties patch by (Edward Hervey:bilboed,gmail com)
michael
parents:
2661
diff
changeset
|
1287 s->picture.key_frame = 1; |
|
fdedaa2e6da4
DV video encoder/decoder doesn't set keyframe and picture type properties patch by (Edward Hervey:bilboed,gmail com)
michael
parents:
2661
diff
changeset
|
1288 s->picture.pict_type = FF_I_TYPE; |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1289 |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1290 s->buf = buf; |
| 8163 | 1291 c->execute(c, dv_encode_video_segment, s->sys->work_chunks, NULL, |
| 8131 | 1292 dv_work_pool_size(s->sys), sizeof(DVwork_chunk)); |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1293 |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1294 emms_c(); |
| 3167 | 1295 |
|
3671
18113845d891
* Restructuring the division of labor between DV codec and DV format
romansh
parents:
3649
diff
changeset
|
1296 dv_format_frame(s, buf); |
| 3167 | 1297 |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1298 return s->sys->frame_size; |
|
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1299 } |
| 3806 | 1300 #endif |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1301 |
|
2991
d377b0788381
Fix DV memory leak and allow multiple instances patch by (Burkhard Plaum?)
michael
parents:
2979
diff
changeset
|
1302 static int dvvideo_close(AVCodecContext *c) |
|
d377b0788381
Fix DV memory leak and allow multiple instances patch by (Burkhard Plaum?)
michael
parents:
2979
diff
changeset
|
1303 { |
|
4352
0ee71c12734e
* Fixing a bug with incorrect bits set in AAUX source pack
romansh
parents:
4283
diff
changeset
|
1304 DVVideoContext *s = c->priv_data; |
|
0ee71c12734e
* Fixing a bug with incorrect bits set in AAUX source pack
romansh
parents:
4283
diff
changeset
|
1305 |
| 8051 | 1306 if (s->picture.data[0]) |
|
4352
0ee71c12734e
* Fixing a bug with incorrect bits set in AAUX source pack
romansh
parents:
4283
diff
changeset
|
1307 c->release_buffer(c, &s->picture); |
|
2991
d377b0788381
Fix DV memory leak and allow multiple instances patch by (Burkhard Plaum?)
michael
parents:
2979
diff
changeset
|
1308 |
|
d377b0788381
Fix DV memory leak and allow multiple instances patch by (Burkhard Plaum?)
michael
parents:
2979
diff
changeset
|
1309 return 0; |
|
d377b0788381
Fix DV memory leak and allow multiple instances patch by (Burkhard Plaum?)
michael
parents:
2979
diff
changeset
|
1310 } |
|
d377b0788381
Fix DV memory leak and allow multiple instances patch by (Burkhard Plaum?)
michael
parents:
2979
diff
changeset
|
1311 |
|
d377b0788381
Fix DV memory leak and allow multiple instances patch by (Burkhard Plaum?)
michael
parents:
2979
diff
changeset
|
1312 |
| 8590 | 1313 #if CONFIG_DVVIDEO_ENCODER |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1314 AVCodec dvvideo_encoder = { |
|
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1315 "dvvideo", |
|
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1316 CODEC_TYPE_VIDEO, |
|
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1317 CODEC_ID_DVVIDEO, |
|
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1318 sizeof(DVVideoContext), |
|
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1319 dvvideo_init, |
|
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1320 dvvideo_encode_frame, |
| 8051 | 1321 .pix_fmts = (enum PixelFormat[]) {PIX_FMT_YUV411P, PIX_FMT_YUV422P, PIX_FMT_YUV420P, PIX_FMT_NONE}, |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
7039
diff
changeset
|
1322 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"), |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1323 }; |
|
2661
b2846918585c
a few #ifdef CONFIG_X_ENCODER, patch by (Roine Gustafsson <roine users.sourceforge net]
michael
parents:
2614
diff
changeset
|
1324 #endif // CONFIG_DVVIDEO_ENCODER |
| 723 | 1325 |
| 8590 | 1326 #if CONFIG_DVVIDEO_DECODER |
| 723 | 1327 AVCodec dvvideo_decoder = { |
| 1328 "dvvideo", | |
| 1329 CODEC_TYPE_VIDEO, | |
| 1330 CODEC_ID_DVVIDEO, | |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1331 sizeof(DVVideoContext), |
|
1493
ad7e62df9962
* preAlpha DV encoding support -- there's still a truckload
romansh
parents:
1489
diff
changeset
|
1332 dvvideo_init, |
|
1887
85fe2f4633ec
* DV decoding/encoding now supports MultiThreading for up to 324 CPUs ;-)
romansh
parents:
1886
diff
changeset
|
1333 NULL, |
|
2991
d377b0788381
Fix DV memory leak and allow multiple instances patch by (Burkhard Plaum?)
michael
parents:
2979
diff
changeset
|
1334 dvvideo_close, |
| 723 | 1335 dvvideo_decode_frame, |
| 835 | 1336 CODEC_CAP_DR1, |
| 6717 | 1337 NULL, |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
7039
diff
changeset
|
1338 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"), |
| 723 | 1339 }; |
| 3777 | 1340 #endif |
