Mercurial > libavcodec.hg
annotate mpegvideo.c @ 12071:126392340f69 libavcodec
Remove angular brackets from Doxygen comments; Doxygen confuses them for HTML.
author | diego |
---|---|
date | Fri, 02 Jul 2010 12:48:32 +0000 |
parents | 25e9cb2b9477 |
children | 84df7b6b1929 |
rev | line source |
---|---|
0 | 1 /* |
2 * The simplest mpeg encoder (well, it was the simplest!) | |
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8596
diff
changeset
|
3 * Copyright (c) 2000,2001 Fabrice Bellard |
1739
07a484280a82
copyright year update of the files i touched and remembered, things look annoyingly unmaintained otherwise
michael
parents:
1729
diff
changeset
|
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> |
0 | 5 * |
5214 | 6 * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at> |
7 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3939
diff
changeset
|
8 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3939
diff
changeset
|
9 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3939
diff
changeset
|
10 * FFmpeg is free software; you can redistribute it and/or |
429 | 11 * modify it under the terms of the GNU Lesser General Public |
12 * 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:
3939
diff
changeset
|
13 * version 2.1 of the License, or (at your option) any later version. |
0 | 14 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3939
diff
changeset
|
15 * FFmpeg is distributed in the hope that it will be useful, |
0 | 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
429 | 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
18 * Lesser General Public License for more details. | |
0 | 19 * |
429 | 20 * 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:
3939
diff
changeset
|
21 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
3011
diff
changeset
|
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 23 */ |
2967 | 24 |
1106 | 25 /** |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11531
diff
changeset
|
26 * @file |
1106 | 27 * The simplest mpeg encoder (well, it was the simplest!). |
2967 | 28 */ |
29 | |
11417 | 30 #include "libavutil/intmath.h" |
0 | 31 #include "avcodec.h" |
32 #include "dsputil.h" | |
11742
a37818ac3817
Factorize some code into the new function ff_toupper4().
cehoyos
parents:
11644
diff
changeset
|
33 #include "internal.h" |
0 | 34 #include "mpegvideo.h" |
5204 | 35 #include "mpegvideo_common.h" |
5028 | 36 #include "mjpegenc.h" |
4967
6d45158e0249
disable reference to msmpeg4 and wmv2 code when those codecs are not compiled in
aurel
parents:
4668
diff
changeset
|
37 #include "msmpeg4.h" |
1557 | 38 #include "faandct.h" |
8881
f8042554d4c8
Add xvmc_internal.h that contains all internal xvmc function declarations.
diego
parents:
8859
diff
changeset
|
39 #include "xvmc_internal.h" |
2024
f65d87bfdd5a
some of the warning fixes by (Michael Roitzsch <mroi at users dot sourceforge dot net>)
michael
parents:
2015
diff
changeset
|
40 #include <limits.h> |
0 | 41 |
1422
efeed6e29f9b
oooooops, having 2 Eterms open and doing cvs diff in one and cvs commit in the other sucks, especially if they are in different directories (MPlayer/main/libavcodec vs. ffmpeg/libavcodec)
michaelni
parents:
1421
diff
changeset
|
42 //#undef NDEBUG |
efeed6e29f9b
oooooops, having 2 Eterms open and doing cvs diff in one and cvs commit in the other sucks, especially if they are in different directories (MPlayer/main/libavcodec vs. ffmpeg/libavcodec)
michaelni
parents:
1421
diff
changeset
|
43 //#include <assert.h> |
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
704
diff
changeset
|
44 |
2967 | 45 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s, |
1689 | 46 DCTELEM *block, int n, int qscale); |
2967 | 47 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s, |
1689 | 48 DCTELEM *block, int n, int qscale); |
49 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s, | |
13
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
50 DCTELEM *block, int n, int qscale); |
3281
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
51 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s, |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
52 DCTELEM *block, int n, int qscale); |
1689 | 53 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s, |
325 | 54 DCTELEM *block, int n, int qscale); |
2967 | 55 static void dct_unquantize_h263_intra_c(MpegEncContext *s, |
1689 | 56 DCTELEM *block, int n, int qscale); |
2967 | 57 static void dct_unquantize_h263_inter_c(MpegEncContext *s, |
13
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
58 DCTELEM *block, int n, int qscale); |
206 | 59 |
0 | 60 |
61 /* enable all paranoid tests for rounding, overflows, etc... */ | |
62 //#define PARANOID | |
63 | |
64 //#define DEBUG | |
65 | |
321 | 66 |
1644 | 67 static const uint8_t ff_default_chroma_qscale_table[32]={ |
68 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
69 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 | |
70 }; | |
71 | |
6459 | 72 const uint8_t ff_mpeg1_dc_scale_table[128]={ |
73 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
74 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
75 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
76 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
77 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
78 }; | |
79 | |
11494 | 80 static const uint8_t mpeg2_dc_scale_table1[128]={ |
81 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
82 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
83 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
84 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
85 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
86 }; | |
87 | |
88 static const uint8_t mpeg2_dc_scale_table2[128]={ | |
89 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
90 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
91 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
92 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
93 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
94 }; | |
95 | |
96 static const uint8_t mpeg2_dc_scale_table3[128]={ | |
97 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
98 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
99 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
100 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
101 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
102 }; | |
103 | |
11495 | 104 const uint8_t * const ff_mpeg2_dc_scale_table[4]={ |
11494 | 105 ff_mpeg1_dc_scale_table, |
106 mpeg2_dc_scale_table1, | |
107 mpeg2_dc_scale_table2, | |
108 mpeg2_dc_scale_table3, | |
109 }; | |
110 | |
9028 | 111 const enum PixelFormat ff_pixfmt_list_420[] = { |
112 PIX_FMT_YUV420P, | |
113 PIX_FMT_NONE | |
114 }; | |
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
704
diff
changeset
|
115 |
9060 | 116 const enum PixelFormat ff_hwaccel_pixfmt_list_420[] = { |
10952 | 117 PIX_FMT_DXVA2_VLD, |
9332 | 118 PIX_FMT_VAAPI_VLD, |
9060 | 119 PIX_FMT_YUV420P, |
120 PIX_FMT_NONE | |
121 }; | |
122 | |
3086 | 123 const uint8_t *ff_find_start_code(const uint8_t * restrict p, const uint8_t *end, uint32_t * restrict state){ |
124 int i; | |
125 | |
3092 | 126 assert(p<=end); |
127 if(p>=end) | |
128 return end; | |
129 | |
3086 | 130 for(i=0; i<3; i++){ |
131 uint32_t tmp= *state << 8; | |
132 *state= tmp + *(p++); | |
133 if(tmp == 0x100 || p==end) | |
134 return p; | |
135 } | |
136 | |
137 while(p<end){ | |
3087 | 138 if (p[-1] > 1 ) p+= 3; |
139 else if(p[-2] ) p+= 2; | |
140 else if(p[-3]|(p[-1]-1)) p++; | |
3086 | 141 else{ |
142 p++; | |
143 break; | |
144 } | |
145 } | |
146 | |
3087 | 147 p= FFMIN(p, end)-4; |
5424
07844149dfa9
replacing the use of deprecated unaligned*() routines by LD64 and AV_RB32
romansh
parents:
5286
diff
changeset
|
148 *state= AV_RB32(p); |
3086 | 149 |
150 return p+4; | |
151 } | |
152 | |
726
a91203b34e71
moved dct init out from mpv_common_init to dct_common_init (for less-uglier way for dv)
al3x
parents:
721
diff
changeset
|
153 /* init common dct for both encoder and decoder */ |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
9003
diff
changeset
|
154 av_cold int ff_dct_common_init(MpegEncContext *s) |
0 | 155 { |
1689 | 156 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c; |
157 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c; | |
158 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c; | |
159 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c; | |
160 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c; | |
3281
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
161 if(s->flags & CODEC_FLAG_BITEXACT) |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
162 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact; |
1689 | 163 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c; |
1092 | 164 |
8590 | 165 #if HAVE_MMX |
1422
efeed6e29f9b
oooooops, having 2 Eterms open and doing cvs diff in one and cvs commit in the other sucks, especially if they are in different directories (MPlayer/main/libavcodec vs. ffmpeg/libavcodec)
michaelni
parents:
1421
diff
changeset
|
166 MPV_common_init_mmx(s); |
8590 | 167 #elif ARCH_ALPHA |
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M«©ns Rullg«©rd
mellum
parents:
506
diff
changeset
|
168 MPV_common_init_axp(s); |
8590 | 169 #elif CONFIG_MLIB |
628
f596db4aa871
sun solaris compilation bugfix, patch by (Martin Olschewski <olschewski at zpr dot uni-koeln dot de>)
michaelni
parents:
625
diff
changeset
|
170 MPV_common_init_mlib(s); |
8590 | 171 #elif HAVE_MMI |
721
71f669e9f633
ps2 optimizations update patch by (Leon van Stuivenberg <leonvs at iae dot nl>)
michaelni
parents:
717
diff
changeset
|
172 MPV_common_init_mmi(s); |
8590 | 173 #elif ARCH_ARM |
8359 | 174 MPV_common_init_arm(s); |
8590 | 175 #elif HAVE_ALTIVEC |
5761
72b59f7613af
Rename MPV_common_init_ppc to MPV_common_init_altivec, the function is
diego
parents:
5760
diff
changeset
|
176 MPV_common_init_altivec(s); |
8590 | 177 #elif ARCH_BFIN |
5132
a3b82ca01e68
integrating MPV_common_init_bfin into the build system and mpegvideo.c
mhoffman
parents:
5129
diff
changeset
|
178 MPV_common_init_bfin(s); |
a3b82ca01e68
integrating MPV_common_init_bfin into the build system and mpegvideo.c
mhoffman
parents:
5129
diff
changeset
|
179 #endif |
730 | 180 |
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
704
diff
changeset
|
181 /* load & permutate scantables |
2967 | 182 note: only wmv uses different ones |
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
704
diff
changeset
|
183 */ |
1708 | 184 if(s->alternate_scan){ |
185 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan); | |
186 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan); | |
187 }else{ | |
188 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct); | |
189 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct); | |
190 } | |
1273 | 191 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan); |
192 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); | |
591 | 193 |
726
a91203b34e71
moved dct init out from mpv_common_init to dct_common_init (for less-uglier way for dv)
al3x
parents:
721
diff
changeset
|
194 return 0; |
a91203b34e71
moved dct init out from mpv_common_init to dct_common_init (for less-uglier way for dv)
al3x
parents:
721
diff
changeset
|
195 } |
a91203b34e71
moved dct init out from mpv_common_init to dct_common_init (for less-uglier way for dv)
al3x
parents:
721
diff
changeset
|
196 |
7974 | 197 void ff_copy_picture(Picture *dst, Picture *src){ |
1539
14d01ccc0081
picture buffer cleanup, this fixes a assertion failure (if assertion checking was manualy enabled for utils.c) and a memleak at least
michael
parents:
1530
diff
changeset
|
198 *dst = *src; |
14d01ccc0081
picture buffer cleanup, this fixes a assertion failure (if assertion checking was manualy enabled for utils.c) and a memleak at least
michael
parents:
1530
diff
changeset
|
199 dst->type= FF_BUFFER_TYPE_COPY; |
14d01ccc0081
picture buffer cleanup, this fixes a assertion failure (if assertion checking was manualy enabled for utils.c) and a memleak at least
michael
parents:
1530
diff
changeset
|
200 } |
14d01ccc0081
picture buffer cleanup, this fixes a assertion failure (if assertion checking was manualy enabled for utils.c) and a memleak at least
michael
parents:
1530
diff
changeset
|
201 |
903 | 202 /** |
12024 | 203 * Release a frame buffer |
9124 | 204 */ |
205 static void free_frame_buffer(MpegEncContext *s, Picture *pic) | |
206 { | |
207 s->avctx->release_buffer(s->avctx, (AVFrame*)pic); | |
9200
7b62de9c383d
Rename hwaccel_data_private to hwaccel_picture_private.
gb
parents:
9161
diff
changeset
|
208 av_freep(&pic->hwaccel_picture_private); |
9124 | 209 } |
210 | |
211 /** | |
12024 | 212 * Allocate a frame buffer |
9124 | 213 */ |
214 static int alloc_frame_buffer(MpegEncContext *s, Picture *pic) | |
215 { | |
216 int r; | |
217 | |
9155 | 218 if (s->avctx->hwaccel) { |
9200
7b62de9c383d
Rename hwaccel_data_private to hwaccel_picture_private.
gb
parents:
9161
diff
changeset
|
219 assert(!pic->hwaccel_picture_private); |
9155 | 220 if (s->avctx->hwaccel->priv_data_size) { |
9200
7b62de9c383d
Rename hwaccel_data_private to hwaccel_picture_private.
gb
parents:
9161
diff
changeset
|
221 pic->hwaccel_picture_private = av_mallocz(s->avctx->hwaccel->priv_data_size); |
7b62de9c383d
Rename hwaccel_data_private to hwaccel_picture_private.
gb
parents:
9161
diff
changeset
|
222 if (!pic->hwaccel_picture_private) { |
9155 | 223 av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n"); |
224 return -1; | |
225 } | |
226 } | |
227 } | |
228 | |
9124 | 229 r = s->avctx->get_buffer(s->avctx, (AVFrame*)pic); |
230 | |
231 if (r<0 || !pic->age || !pic->type || !pic->data[0]) { | |
232 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]); | |
9200
7b62de9c383d
Rename hwaccel_data_private to hwaccel_picture_private.
gb
parents:
9161
diff
changeset
|
233 av_freep(&pic->hwaccel_picture_private); |
9124 | 234 return -1; |
235 } | |
236 | |
237 if (s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])) { | |
238 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n"); | |
239 free_frame_buffer(s, pic); | |
240 return -1; | |
241 } | |
242 | |
243 if (pic->linesize[1] != pic->linesize[2]) { | |
244 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n"); | |
245 free_frame_buffer(s, pic); | |
246 return -1; | |
247 } | |
248 | |
249 return 0; | |
250 } | |
251 | |
252 /** | |
924 | 253 * allocates a Picture |
254 * The pixels are allocated/set by calling get_buffer() if shared=0 | |
903 | 255 */ |
9721
5d0f71ba8648
Rename alloc_picture to ff_alloc_picture and move its definition
bcoudurier
parents:
9644
diff
changeset
|
256 int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared){ |
5127 | 257 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) does not sig11 |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
258 const int mb_array_size= s->mb_stride*s->mb_height; |
1655 | 259 const int b8_array_size= s->b8_stride*s->mb_height*2; |
260 const int b4_array_size= s->b4_stride*s->mb_height*4; | |
1168 | 261 int i; |
5427 | 262 int r= -1; |
2967 | 263 |
924 | 264 if(shared){ |
265 assert(pic->data[0]); | |
266 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED); | |
267 pic->type= FF_BUFFER_TYPE_SHARED; | |
268 }else{ | |
269 assert(!pic->data[0]); | |
2967 | 270 |
9124 | 271 if (alloc_frame_buffer(s, pic) < 0) |
924 | 272 return -1; |
273 | |
274 s->linesize = pic->linesize[0]; | |
275 s->uvlinesize= pic->linesize[1]; | |
903 | 276 } |
2967 | 277 |
924 | 278 if(pic->qscale_table==NULL){ |
2967 | 279 if (s->encoding) { |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
280 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_var , mb_array_size * sizeof(int16_t) , fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
281 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mc_mb_var, mb_array_size * sizeof(int16_t) , fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
282 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_mean , mb_array_size * sizeof(int8_t ) , fail) |
924 | 283 } |
284 | |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
285 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2, fail) //the +2 is for the slice end check |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
286 FF_ALLOCZ_OR_GOTO(s->avctx, pic->qscale_table , mb_array_size * sizeof(uint8_t) , fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
287 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_type_base , (big_mb_num + s->mb_stride) * sizeof(uint32_t), fail) |
5955 | 288 pic->mb_type= pic->mb_type_base + 2*s->mb_stride+1; |
1168 | 289 if(s->out_format == FMT_H264){ |
290 for(i=0; i<2; i++){ | |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
291 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b4_array_size+4) * sizeof(int16_t), fail) |
2570 | 292 pic->motion_val[i]= pic->motion_val_base[i]+4; |
11292
411ab09ada91
Get rid of mb2b8_xy and b8_stride, change arrays organized based on b8_stride to
michael
parents:
10952
diff
changeset
|
293 FF_ALLOCZ_OR_GOTO(s->avctx, pic->ref_index[i], 4*mb_array_size * sizeof(uint8_t), fail) |
1655 | 294 } |
1669 | 295 pic->motion_subsample_log2= 2; |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
296 }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){ |
1655 | 297 for(i=0; i<2; i++){ |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
298 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t), fail) |
2570 | 299 pic->motion_val[i]= pic->motion_val_base[i]+4; |
11531
31033caa5344
Change ref_index structure so it matches how its organized in h264.
michael
parents:
11495
diff
changeset
|
300 FF_ALLOCZ_OR_GOTO(s->avctx, pic->ref_index[i], 4*mb_array_size * sizeof(uint8_t), fail) |
1168 | 301 } |
1669 | 302 pic->motion_subsample_log2= 3; |
1168 | 303 } |
1833
ba27ce284d07
export DCT coefficients patch by (Wolfgang Hesseler <wolfgang.hesseler at imk dot fraunhofer dot de>)
michael
parents:
1831
diff
changeset
|
304 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) { |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
305 FF_ALLOCZ_OR_GOTO(s->avctx, pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6, fail) |
1833
ba27ce284d07
export DCT coefficients patch by (Wolfgang Hesseler <wolfgang.hesseler at imk dot fraunhofer dot de>)
michael
parents:
1831
diff
changeset
|
306 } |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
307 pic->qstride= s->mb_stride; |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
308 FF_ALLOCZ_OR_GOTO(s->avctx, pic->pan_scan , 1 * sizeof(AVPanScan), fail) |
924 | 309 } |
1168 | 310 |
5129 | 311 /* It might be nicer if the application would keep track of these |
312 * but it would require an API change. */ | |
1021
2d7c9f5738de
trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents:
1014
diff
changeset
|
313 memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1); |
6867 | 314 s->prev_pict_types[0]= s->dropable ? FF_B_TYPE : s->pict_type; |
6481 | 315 if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == FF_B_TYPE) |
5129 | 316 pic->age= INT_MAX; // Skipped MBs in B-frames are quite rare in MPEG-1/2 and it is a bit tricky to skip them anyway. |
2967 | 317 |
903 | 318 return 0; |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
319 fail: //for the FF_ALLOCZ_OR_GOTO macro |
5427 | 320 if(r>=0) |
9124 | 321 free_frame_buffer(s, pic); |
903 | 322 return -1; |
323 } | |
324 | |
924 | 325 /** |
326 * deallocates a picture | |
327 */ | |
903 | 328 static void free_picture(MpegEncContext *s, Picture *pic){ |
329 int i; | |
924 | 330 |
331 if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){ | |
9124 | 332 free_frame_buffer(s, pic); |
924 | 333 } |
334 | |
903 | 335 av_freep(&pic->mb_var); |
336 av_freep(&pic->mc_mb_var); | |
337 av_freep(&pic->mb_mean); | |
338 av_freep(&pic->mbskip_table); | |
339 av_freep(&pic->qscale_table); | |
1168 | 340 av_freep(&pic->mb_type_base); |
1833
ba27ce284d07
export DCT coefficients patch by (Wolfgang Hesseler <wolfgang.hesseler at imk dot fraunhofer dot de>)
michael
parents:
1831
diff
changeset
|
341 av_freep(&pic->dct_coeff); |
1546 | 342 av_freep(&pic->pan_scan); |
1168 | 343 pic->mb_type= NULL; |
344 for(i=0; i<2; i++){ | |
1655 | 345 av_freep(&pic->motion_val_base[i]); |
1168 | 346 av_freep(&pic->ref_index[i]); |
347 } | |
2967 | 348 |
1214 | 349 if(pic->type == FF_BUFFER_TYPE_SHARED){ |
924 | 350 for(i=0; i<4; i++){ |
351 pic->base[i]= | |
352 pic->data[i]= NULL; | |
353 } | |
2967 | 354 pic->type= 0; |
903 | 355 } |
356 } | |
357 | |
1799 | 358 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){ |
12036 | 359 int y_size = s->b8_stride * (2 * s->mb_height + 1); |
360 int c_size = s->mb_stride * (s->mb_height + 1); | |
361 int yc_size = y_size + 2 * c_size; | |
1799 | 362 int i; |
363 | |
2967 | 364 // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264) |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
365 FF_ALLOCZ_OR_GOTO(s->avctx, s->allocated_edge_emu_buffer, (s->width+64)*2*21*2, fail); //(width + edge + align)*interlaced*MBsize*tolerance |
3316 | 366 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21; |
1799 | 367 |
5127 | 368 //FIXME should be linesize instead of s->width*2 but that is not known before get_buffer() |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
369 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad, (s->width+64)*4*16*2*sizeof(uint8_t), fail) |
8239
dcfdb3352dde
Fix regression test failure with pthreads on multiprocessor systems.
michael
parents:
7974
diff
changeset
|
370 s->me.temp= s->me.scratchpad; |
1799 | 371 s->rd_scratchpad= s->me.scratchpad; |
372 s->b_scratchpad= s->me.scratchpad; | |
373 s->obmc_scratchpad= s->me.scratchpad + 16; | |
374 if (s->encoding) { | |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
375 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.map , ME_MAP_SIZE*sizeof(uint32_t), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
376 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t), fail) |
1799 | 377 if(s->avctx->noise_reduction){ |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
378 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_error_sum, 2 * 64 * sizeof(int), fail) |
1799 | 379 } |
2967 | 380 } |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
381 FF_ALLOCZ_OR_GOTO(s->avctx, s->blocks, 64*12*2 * sizeof(DCTELEM), fail) |
1799 | 382 s->block= s->blocks[0]; |
383 | |
384 for(i=0;i<12;i++){ | |
9003
b595a8a59967
Change the type of pblocks from pointers to short array into
iive
parents:
8982
diff
changeset
|
385 s->pblocks[i] = &s->block[i]; |
1799 | 386 } |
12036 | 387 |
388 if (s->ac_val_base) { | |
389 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base, yc_size * sizeof(int16_t) * 16, fail); | |
390 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1; | |
391 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1; | |
392 s->ac_val[2] = s->ac_val[1] + c_size; | |
393 } | |
394 | |
1799 | 395 return 0; |
396 fail: | |
397 return -1; //free() through MPV_common_end() | |
398 } | |
399 | |
400 static void free_duplicate_context(MpegEncContext *s){ | |
401 if(s==NULL) return; | |
402 | |
403 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL; | |
404 av_freep(&s->me.scratchpad); | |
8239
dcfdb3352dde
Fix regression test failure with pthreads on multiprocessor systems.
michael
parents:
7974
diff
changeset
|
405 s->me.temp= |
2967 | 406 s->rd_scratchpad= |
407 s->b_scratchpad= | |
1799 | 408 s->obmc_scratchpad= NULL; |
2967 | 409 |
1799 | 410 av_freep(&s->dct_error_sum); |
411 av_freep(&s->me.map); | |
412 av_freep(&s->me.score_map); | |
413 av_freep(&s->blocks); | |
12036 | 414 av_freep(&s->ac_val_base); |
1799 | 415 s->block= NULL; |
416 } | |
417 | |
418 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){ | |
419 #define COPY(a) bak->a= src->a | |
420 COPY(allocated_edge_emu_buffer); | |
421 COPY(edge_emu_buffer); | |
422 COPY(me.scratchpad); | |
8239
dcfdb3352dde
Fix regression test failure with pthreads on multiprocessor systems.
michael
parents:
7974
diff
changeset
|
423 COPY(me.temp); |
1799 | 424 COPY(rd_scratchpad); |
425 COPY(b_scratchpad); | |
426 COPY(obmc_scratchpad); | |
427 COPY(me.map); | |
428 COPY(me.score_map); | |
429 COPY(blocks); | |
430 COPY(block); | |
431 COPY(start_mb_y); | |
432 COPY(end_mb_y); | |
433 COPY(me.map_generation); | |
434 COPY(pb); | |
435 COPY(dct_error_sum); | |
1810 | 436 COPY(dct_count[0]); |
437 COPY(dct_count[1]); | |
12036 | 438 COPY(ac_val_base); |
439 COPY(ac_val[0]); | |
440 COPY(ac_val[1]); | |
441 COPY(ac_val[2]); | |
1799 | 442 #undef COPY |
443 } | |
444 | |
1827 | 445 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){ |
1799 | 446 MpegEncContext bak; |
1827 | 447 int i; |
1799 | 448 //FIXME copy only needed parts |
449 //START_TIMER | |
450 backup_duplicate_context(&bak, dst); | |
451 memcpy(dst, src, sizeof(MpegEncContext)); | |
452 backup_duplicate_context(dst, &bak); | |
1827 | 453 for(i=0;i<12;i++){ |
9003
b595a8a59967
Change the type of pblocks from pointers to short array into
iive
parents:
8982
diff
changeset
|
454 dst->pblocks[i] = &dst->block[i]; |
1827 | 455 } |
1799 | 456 //STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads |
457 } | |
458 | |
1892 | 459 /** |
460 * sets the given MpegEncContext to common defaults (same for encoding and decoding). | |
461 * the changed fields will not depend upon the prior state of the MpegEncContext. | |
462 */ | |
5204 | 463 void MPV_common_defaults(MpegEncContext *s){ |
1892 | 464 s->y_dc_scale_table= |
465 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; | |
466 s->chroma_qscale_table= ff_default_chroma_qscale_table; | |
467 s->progressive_frame= 1; | |
468 s->progressive_sequence= 1; | |
469 s->picture_structure= PICT_FRAME; | |
470 | |
471 s->coded_picture_number = 0; | |
472 s->picture_number = 0; | |
473 s->input_picture_number = 0; | |
474 | |
475 s->picture_in_gop_number = 0; | |
1894 | 476 |
477 s->f_code = 1; | |
478 s->b_code = 1; | |
1892 | 479 } |
480 | |
481 /** | |
482 * sets the given MpegEncContext to defaults for decoding. | |
483 * the changed fields will not depend upon the prior state of the MpegEncContext. | |
484 */ | |
485 void MPV_decode_defaults(MpegEncContext *s){ | |
486 MPV_common_defaults(s); | |
487 } | |
488 | |
489 /** | |
490 * init common structure for both encoder and decoder. | |
491 * this assumes that some variables like width/height are already set | |
492 */ | |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
9003
diff
changeset
|
493 av_cold int MPV_common_init(MpegEncContext *s) |
726
a91203b34e71
moved dct init out from mpv_common_init to dct_common_init (for less-uglier way for dv)
al3x
parents:
721
diff
changeset
|
494 { |
5642 | 495 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y, threads; |
726
a91203b34e71
moved dct init out from mpv_common_init to dct_common_init (for less-uglier way for dv)
al3x
parents:
721
diff
changeset
|
496 |
9362 | 497 if(s->codec_id == CODEC_ID_MPEG2VIDEO && !s->progressive_sequence) |
498 s->mb_height = (s->height + 31) / 32 * 2; | |
499 else | |
9426 | 500 s->mb_height = (s->height + 15) / 16; |
3070 | 501 |
8982
a24c04956930
Exit with error if MPV_common_init() is called with PIX_FMT_NONE.
iive
parents:
8949
diff
changeset
|
502 if(s->avctx->pix_fmt == PIX_FMT_NONE){ |
a24c04956930
Exit with error if MPV_common_init() is called with PIX_FMT_NONE.
iive
parents:
8949
diff
changeset
|
503 av_log(s->avctx, AV_LOG_ERROR, "decoding to PIX_FMT_NONE is not supported.\n"); |
a24c04956930
Exit with error if MPV_common_init() is called with PIX_FMT_NONE.
iive
parents:
8949
diff
changeset
|
504 return -1; |
a24c04956930
Exit with error if MPV_common_init() is called with PIX_FMT_NONE.
iive
parents:
8949
diff
changeset
|
505 } |
a24c04956930
Exit with error if MPV_common_init() is called with PIX_FMT_NONE.
iive
parents:
8949
diff
changeset
|
506 |
3070 | 507 if(s->avctx->thread_count > MAX_THREADS || (s->avctx->thread_count > s->mb_height && s->mb_height)){ |
1989 | 508 av_log(s->avctx, AV_LOG_ERROR, "too many threads\n"); |
509 return -1; | |
510 } | |
511 | |
2422 | 512 if((s->width || s->height) && avcodec_check_dimensions(s->avctx, s->width, s->height)) |
513 return -1; | |
514 | |
1092 | 515 dsputil_init(&s->dsp, s->avctx); |
5788 | 516 ff_dct_common_init(s); |
853
eacc2dd8fd9d
* using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents:
847
diff
changeset
|
517 |
754 | 518 s->flags= s->avctx->flags; |
1754
bdf3927bf8c5
closed gop support & flags2 as all bits in flags are used
michael
parents:
1751
diff
changeset
|
519 s->flags2= s->avctx->flags2; |
726
a91203b34e71
moved dct init out from mpv_common_init to dct_common_init (for less-uglier way for dv)
al3x
parents:
721
diff
changeset
|
520 |
903 | 521 s->mb_width = (s->width + 15) / 16; |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
522 s->mb_stride = s->mb_width + 1; |
1655 | 523 s->b8_stride = s->mb_width*2 + 1; |
524 s->b4_stride = s->mb_width*4 + 1; | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
525 mb_array_size= s->mb_height * s->mb_stride; |
1708 | 526 mv_table_size= (s->mb_height+2) * s->mb_stride + 1; |
853
eacc2dd8fd9d
* using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents:
847
diff
changeset
|
527 |
2074
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
528 /* set chroma shifts */ |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
529 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift), |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
530 &(s->chroma_y_shift) ); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
531 |
853
eacc2dd8fd9d
* using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents:
847
diff
changeset
|
532 /* set default edge pos, will be overriden in decode_header if needed */ |
eacc2dd8fd9d
* using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents:
847
diff
changeset
|
533 s->h_edge_pos= s->mb_width*16; |
eacc2dd8fd9d
* using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents:
847
diff
changeset
|
534 s->v_edge_pos= s->mb_height*16; |
eacc2dd8fd9d
* using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents:
847
diff
changeset
|
535 |
eacc2dd8fd9d
* using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents:
847
diff
changeset
|
536 s->mb_num = s->mb_width * s->mb_height; |
2967 | 537 |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
538 s->block_wrap[0]= |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
539 s->block_wrap[1]= |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
540 s->block_wrap[2]= |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
541 s->block_wrap[3]= s->b8_stride; |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
542 s->block_wrap[4]= |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
543 s->block_wrap[5]= s->mb_stride; |
2967 | 544 |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
545 y_size = s->b8_stride * (2 * s->mb_height + 1); |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
546 c_size = s->mb_stride * (s->mb_height + 1); |
756 | 547 yc_size = y_size + 2 * c_size; |
2967 | 548 |
701 | 549 /* convert fourcc to upper case */ |
11742
a37818ac3817
Factorize some code into the new function ff_toupper4().
cehoyos
parents:
11644
diff
changeset
|
550 s->codec_tag = ff_toupper4(s->avctx->codec_tag); |
582
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
551 |
11742
a37818ac3817
Factorize some code into the new function ff_toupper4().
cehoyos
parents:
11644
diff
changeset
|
552 s->stream_codec_tag = ff_toupper4(s->avctx->stream_codec_tag); |
1458
40b69d238beb
AVI stream header FCC / more reliable detection of old xvid files
michaelni
parents:
1451
diff
changeset
|
553 |
925 | 554 s->avctx->coded_frame= (AVFrame*)&s->current_picture; |
903 | 555 |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
556 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num+1)*sizeof(int), fail) //error ressilience code looks cleaner with this |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
557 for(y=0; y<s->mb_height; y++){ |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
558 for(x=0; x<s->mb_width; x++){ |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
559 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
560 } |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
561 } |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
562 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed? |
2967 | 563 |
232
b640ec5948b0
- Now the ME is done for the entire picture when enconding, the
pulento
parents:
231
diff
changeset
|
564 if (s->encoding) { |
324 | 565 /* Allocate MV tables */ |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
566 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
567 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
568 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
569 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
570 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
571 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail) |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
572 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
573 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
574 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
575 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
576 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
577 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1; |
324 | 578 |
650
ef4a33aad86e
reducing sizeof MpegEncContext to avoid stack overflow on crap M$ windo$
michaelni
parents:
635
diff
changeset
|
579 if(s->msmpeg4_version){ |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
580 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int), fail); |
650
ef4a33aad86e
reducing sizeof MpegEncContext to avoid stack overflow on crap M$ windo$
michaelni
parents:
635
diff
changeset
|
581 } |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
582 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
583 |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
584 /* Allocate MB type table */ |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
585 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type , mb_array_size * sizeof(uint16_t), fail) //needed for encoding |
2967 | 586 |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
587 FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail) |
2967 | 588 |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
589 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix , 64*32 * sizeof(int), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
590 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix , 64*32 * sizeof(int), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
591 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
592 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
593 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
594 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail) |
2967 | 595 |
1597 | 596 if(s->avctx->noise_reduction){ |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
597 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail) |
1597 | 598 } |
232
b640ec5948b0
- Now the ME is done for the entire picture when enconding, the
pulento
parents:
231
diff
changeset
|
599 } |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
600 FF_ALLOCZ_OR_GOTO(s->avctx, s->picture, MAX_PICTURE_COUNT * sizeof(Picture), fail) |
9828
6487152f17f2
Properly initialize AVFrames to default values in the MPEG decoder (fixes
lucabe
parents:
9721
diff
changeset
|
601 for(i = 0; i < MAX_PICTURE_COUNT; i++) { |
6487152f17f2
Properly initialize AVFrames to default values in the MPEG decoder (fixes
lucabe
parents:
9721
diff
changeset
|
602 avcodec_get_frame_defaults((AVFrame *)&s->picture[i]); |
6487152f17f2
Properly initialize AVFrames to default values in the MPEG decoder (fixes
lucabe
parents:
9721
diff
changeset
|
603 } |
1552
26c6ecba99a1
dynamic alloc of picture structs instead of putting them in MpegEncContext
michael
parents:
1546
diff
changeset
|
604 |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
605 FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table, mb_array_size*sizeof(uint8_t), fail) |
2967 | 606 |
1708 | 607 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){ |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
731
diff
changeset
|
608 /* interlaced direct mode decoding tables */ |
1708 | 609 for(i=0; i<2; i++){ |
610 int j, k; | |
611 for(j=0; j<2; j++){ | |
612 for(k=0; k<2; k++){ | |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
613 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_mv_table_base[i][j][k], mv_table_size * 2 * sizeof(int16_t), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
614 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1; |
1708 | 615 } |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
616 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
617 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
618 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j]+ s->mb_stride + 1; |
1708 | 619 } |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
620 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail) |
1708 | 621 } |
0 | 622 } |
767 | 623 if (s->out_format == FMT_H263) { |
0 | 624 /* ac values */ |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
625 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base, yc_size * sizeof(int16_t) * 16, fail); |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
626 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1; |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
627 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1; |
0 | 628 s->ac_val[2] = s->ac_val[1] + c_size; |
2967 | 629 |
0 | 630 /* cbp values */ |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
631 FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size, fail); |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
632 s->coded_block= s->coded_block_base + s->b8_stride + 1; |
2967 | 633 |
456 | 634 /* cbp, ac_pred, pred_dir */ |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
635 FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table , mb_array_size * sizeof(uint8_t), fail) |
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
636 FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail) |
197
21abf1b20016
different fix, s->mbintra_table used only if h263_pred set. - patch by Michael Niedermayer <michaelni@gmx.at>
arpi_esp
parents:
196
diff
changeset
|
637 } |
2967 | 638 |
756 | 639 if (s->h263_pred || s->h263_plus || !s->encoding) { |
640 /* dc values */ | |
641 //MN: we need these for error resilience of intra-frames | |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
642 FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail); |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
643 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1; |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
644 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1; |
756 | 645 s->dc_val[2] = s->dc_val[1] + c_size; |
646 for(i=0;i<yc_size;i++) | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
647 s->dc_val_base[i] = 1024; |
756 | 648 } |
649 | |
611
3214d3f4519e
error concealment needs the mbintra_table so it should allways be allocated
michaelni
parents:
608
diff
changeset
|
650 /* which mb is a intra block */ |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
651 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
652 memset(s->mbintra_table, 1, mb_array_size); |
2967 | 653 |
7
1d3ac9654178
added skip macroblock optimization (big perf win on black regions for example)
glantau
parents:
0
diff
changeset
|
654 /* init macroblock skip table */ |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
655 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size+2, fail); |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
731
diff
changeset
|
656 //Note the +1 is for a quicker mpeg4 slice_end detection |
10137
9a670cfd1941
Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents:
9828
diff
changeset
|
657 FF_ALLOCZ_OR_GOTO(s->avctx, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE, fail); |
2967 | 658 |
842
e460775adb38
cleanup (breaks compatibility, requested by fabrice)
michaelni
parents:
828
diff
changeset
|
659 s->parse_context.state= -1; |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
660 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){ |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
661 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH); |
7456
211cca1e3f39
fix mpeg 4:2:2 vis_qp and vis_mb_type debug, fix issue #471
bcoudurier
parents:
7377
diff
changeset
|
662 s->visualization_buffer[1] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH); |
211cca1e3f39
fix mpeg 4:2:2 vis_qp and vis_mb_type debug, fix issue #471
bcoudurier
parents:
7377
diff
changeset
|
663 s->visualization_buffer[2] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH); |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
664 } |
842
e460775adb38
cleanup (breaks compatibility, requested by fabrice)
michaelni
parents:
828
diff
changeset
|
665 |
0 | 666 s->context_initialized = 1; |
1799 | 667 |
668 s->thread_context[0]= s; | |
6193
52ccab2531bd
Fix memory leak in h264 decoder. allocated_edge_emu_buffer was being allocated
heydowns
parents:
5955
diff
changeset
|
669 threads = s->avctx->thread_count; |
5642 | 670 |
671 for(i=1; i<threads; i++){ | |
1799 | 672 s->thread_context[i]= av_malloc(sizeof(MpegEncContext)); |
673 memcpy(s->thread_context[i], s, sizeof(MpegEncContext)); | |
674 } | |
675 | |
5642 | 676 for(i=0; i<threads; i++){ |
1799 | 677 if(init_duplicate_context(s->thread_context[i], s) < 0) |
678 goto fail; | |
679 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count; | |
680 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count; | |
681 } | |
682 | |
0 | 683 return 0; |
684 fail: | |
244 | 685 MPV_common_end(s); |
686 return -1; | |
687 } | |
688 | |
689 /* init common structure for both encoder and decoder */ | |
690 void MPV_common_end(MpegEncContext *s) | |
691 { | |
1708 | 692 int i, j, k; |
244 | 693 |
1799 | 694 for(i=0; i<s->avctx->thread_count; i++){ |
695 free_duplicate_context(s->thread_context[i]); | |
696 } | |
697 for(i=1; i<s->avctx->thread_count; i++){ | |
698 av_freep(&s->thread_context[i]); | |
699 } | |
700 | |
1344
447b88b784ee
memleak fix by (Jake Page <jake at CS dot Stanford dot EDU>)
michaelni
parents:
1339
diff
changeset
|
701 av_freep(&s->parse_context.buffer); |
447b88b784ee
memleak fix by (Jake Page <jake at CS dot Stanford dot EDU>)
michaelni
parents:
1339
diff
changeset
|
702 s->parse_context.buffer_size=0; |
447b88b784ee
memleak fix by (Jake Page <jake at CS dot Stanford dot EDU>)
michaelni
parents:
1339
diff
changeset
|
703 |
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
376
diff
changeset
|
704 av_freep(&s->mb_type); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
705 av_freep(&s->p_mv_table_base); |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
706 av_freep(&s->b_forw_mv_table_base); |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
707 av_freep(&s->b_back_mv_table_base); |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
708 av_freep(&s->b_bidir_forw_mv_table_base); |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
709 av_freep(&s->b_bidir_back_mv_table_base); |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
710 av_freep(&s->b_direct_mv_table_base); |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
711 s->p_mv_table= NULL; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
712 s->b_forw_mv_table= NULL; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
713 s->b_back_mv_table= NULL; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
714 s->b_bidir_forw_mv_table= NULL; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
715 s->b_bidir_back_mv_table= NULL; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
716 s->b_direct_mv_table= NULL; |
1708 | 717 for(i=0; i<2; i++){ |
718 for(j=0; j<2; j++){ | |
719 for(k=0; k<2; k++){ | |
720 av_freep(&s->b_field_mv_table_base[i][j][k]); | |
721 s->b_field_mv_table[i][j][k]=NULL; | |
722 } | |
723 av_freep(&s->b_field_select_table[i][j]); | |
724 av_freep(&s->p_field_mv_table_base[i][j]); | |
725 s->p_field_mv_table[i][j]=NULL; | |
726 } | |
727 av_freep(&s->p_field_select_table[i]); | |
728 } | |
2967 | 729 |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
730 av_freep(&s->dc_val_base); |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
731 av_freep(&s->ac_val_base); |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
732 av_freep(&s->coded_block_base); |
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
376
diff
changeset
|
733 av_freep(&s->mbintra_table); |
456 | 734 av_freep(&s->cbp_table); |
735 av_freep(&s->pred_dir_table); | |
2967 | 736 |
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
376
diff
changeset
|
737 av_freep(&s->mbskip_table); |
1021
2d7c9f5738de
trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents:
1014
diff
changeset
|
738 av_freep(&s->prev_pict_types); |
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
376
diff
changeset
|
739 av_freep(&s->bitstream_buffer); |
2422 | 740 s->allocated_bitstream_buffer_size=0; |
741 | |
612 | 742 av_freep(&s->avctx->stats_out); |
650
ef4a33aad86e
reducing sizeof MpegEncContext to avoid stack overflow on crap M$ windo$
michaelni
parents:
635
diff
changeset
|
743 av_freep(&s->ac_stats); |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
731
diff
changeset
|
744 av_freep(&s->error_status_table); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
745 av_freep(&s->mb_index2xy); |
1505
010f76d07a27
use lagrange multipler instead of qp for ratecontrol, this may break some things, tell me ASAP if u notice anything broken
michaelni
parents:
1497
diff
changeset
|
746 av_freep(&s->lambda_table); |
1553
541681146f83
move q_*_matrix out of MpegEncContext (40k ->23k) dct_quantize() is even slightly faster now, dont ask my why ...
michael
parents:
1552
diff
changeset
|
747 av_freep(&s->q_intra_matrix); |
541681146f83
move q_*_matrix out of MpegEncContext (40k ->23k) dct_quantize() is even slightly faster now, dont ask my why ...
michael
parents:
1552
diff
changeset
|
748 av_freep(&s->q_inter_matrix); |
1554
d736e24bf303
move mmx quantizer matrixes out of MpegEncContext (23k -> 7k) (no meassureable slowdown)
michael
parents:
1553
diff
changeset
|
749 av_freep(&s->q_intra_matrix16); |
d736e24bf303
move mmx quantizer matrixes out of MpegEncContext (23k -> 7k) (no meassureable slowdown)
michael
parents:
1553
diff
changeset
|
750 av_freep(&s->q_inter_matrix16); |
1556 | 751 av_freep(&s->input_picture); |
752 av_freep(&s->reordered_input_picture); | |
1597 | 753 av_freep(&s->dct_offset); |
903 | 754 |
1573 | 755 if(s->picture){ |
756 for(i=0; i<MAX_PICTURE_COUNT; i++){ | |
757 free_picture(s, &s->picture[i]); | |
758 } | |
0 | 759 } |
1552
26c6ecba99a1
dynamic alloc of picture structs instead of putting them in MpegEncContext
michael
parents:
1546
diff
changeset
|
760 av_freep(&s->picture); |
0 | 761 s->context_initialized = 0; |
1523 | 762 s->last_picture_ptr= |
763 s->next_picture_ptr= | |
764 s->current_picture_ptr= NULL; | |
2231 | 765 s->linesize= s->uvlinesize= 0; |
1918
ea20f38b8d57
nicer looking arrows for the motion vector vissualization
michael
parents:
1916
diff
changeset
|
766 |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
767 for(i=0; i<3; i++) |
1918
ea20f38b8d57
nicer looking arrows for the motion vector vissualization
michael
parents:
1916
diff
changeset
|
768 av_freep(&s->visualization_buffer[i]); |
2231 | 769 |
770 avcodec_default_free_buffers(s->avctx); | |
0 | 771 } |
772 | |
4668 | 773 void init_rl(RLTable *rl, uint8_t static_store[2][2*MAX_RUN + MAX_LEVEL + 3]) |
1042 | 774 { |
1064 | 775 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1]; |
776 uint8_t index_run[MAX_RUN+1]; | |
1042 | 777 int last, run, level, start, end, i; |
778 | |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2364
diff
changeset
|
779 /* If table is static, we can quit if rl->max_level[0] is not NULL */ |
4668 | 780 if(static_store && rl->max_level[0]) |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2364
diff
changeset
|
781 return; |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2364
diff
changeset
|
782 |
1042 | 783 /* compute max_level[], max_run[] and index_run[] */ |
784 for(last=0;last<2;last++) { | |
785 if (last == 0) { | |
786 start = 0; | |
787 end = rl->last; | |
788 } else { | |
789 start = rl->last; | |
790 end = rl->n; | |
791 } | |
792 | |
793 memset(max_level, 0, MAX_RUN + 1); | |
794 memset(max_run, 0, MAX_LEVEL + 1); | |
795 memset(index_run, rl->n, MAX_RUN + 1); | |
796 for(i=start;i<end;i++) { | |
797 run = rl->table_run[i]; | |
798 level = rl->table_level[i]; | |
799 if (index_run[run] == rl->n) | |
800 index_run[run] = i; | |
801 if (level > max_level[run]) | |
802 max_level[run] = level; | |
803 if (run > max_run[level]) | |
804 max_run[level] = run; | |
805 } | |
4668 | 806 if(static_store) |
807 rl->max_level[last] = static_store[last]; | |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2364
diff
changeset
|
808 else |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2364
diff
changeset
|
809 rl->max_level[last] = av_malloc(MAX_RUN + 1); |
1042 | 810 memcpy(rl->max_level[last], max_level, MAX_RUN + 1); |
4668 | 811 if(static_store) |
812 rl->max_run[last] = static_store[last] + MAX_RUN + 1; | |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2364
diff
changeset
|
813 else |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2364
diff
changeset
|
814 rl->max_run[last] = av_malloc(MAX_LEVEL + 1); |
1042 | 815 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1); |
4668 | 816 if(static_store) |
817 rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2; | |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2364
diff
changeset
|
818 else |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2364
diff
changeset
|
819 rl->index_run[last] = av_malloc(MAX_RUN + 1); |
1042 | 820 memcpy(rl->index_run[last], index_run, MAX_RUN + 1); |
821 } | |
822 } | |
823 | |
6940
778ecab25dd8
Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents:
6867
diff
changeset
|
824 void init_vlc_rl(RLTable *rl) |
5274 | 825 { |
826 int i, q; | |
827 | |
828 for(q=0; q<32; q++){ | |
829 int qmul= q*2; | |
830 int qadd= (q-1)|1; | |
831 | |
832 if(q==0){ | |
833 qmul=1; | |
834 qadd=0; | |
835 } | |
836 for(i=0; i<rl->vlc.table_size; i++){ | |
837 int code= rl->vlc.table[i][0]; | |
838 int len = rl->vlc.table[i][1]; | |
839 int level, run; | |
840 | |
841 if(len==0){ // illegal code | |
842 run= 66; | |
843 level= MAX_LEVEL; | |
844 }else if(len<0){ //more bits needed | |
845 run= 0; | |
846 level= code; | |
847 }else{ | |
848 if(code==rl->n){ //esc | |
849 run= 66; | |
850 level= 0; | |
851 }else{ | |
852 run= rl->table_run [code] + 1; | |
853 level= rl->table_level[code] * qmul + qadd; | |
854 if(code >= rl->last) run+=192; | |
855 } | |
856 } | |
857 rl->rl_vlc[q][i].len= len; | |
858 rl->rl_vlc[q][i].level= level; | |
859 rl->rl_vlc[q][i].run= run; | |
860 } | |
861 } | |
862 } | |
863 | |
1586 | 864 int ff_find_unused_picture(MpegEncContext *s, int shared){ |
924 | 865 int i; |
2967 | 866 |
924 | 867 if(shared){ |
868 for(i=0; i<MAX_PICTURE_COUNT; i++){ | |
1586 | 869 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i; |
924 | 870 } |
871 }else{ | |
872 for(i=0; i<MAX_PICTURE_COUNT; i++){ | |
1586 | 873 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME |
924 | 874 } |
875 for(i=0; i<MAX_PICTURE_COUNT; i++){ | |
1586 | 876 if(s->picture[i].data[0]==NULL) return i; |
924 | 877 } |
878 } | |
879 | |
5836
0859108b4ae3
replace (disabled by default) assert(0) by abort() if the picture buffer
michael
parents:
5798
diff
changeset
|
880 av_log(s->avctx, AV_LOG_FATAL, "Internal error, picture buffer overflow\n"); |
5850
da358b2602ce
Clarify comment block and rewrite in better English.
diego
parents:
5836
diff
changeset
|
881 /* We could return -1, but the codec would crash trying to draw into a |
da358b2602ce
Clarify comment block and rewrite in better English.
diego
parents:
5836
diff
changeset
|
882 * non-existing frame anyway. This is safer than waiting for a random crash. |
da358b2602ce
Clarify comment block and rewrite in better English.
diego
parents:
5836
diff
changeset
|
883 * Also the return of this is never useful, an encoder must only allocate |
da358b2602ce
Clarify comment block and rewrite in better English.
diego
parents:
5836
diff
changeset
|
884 * as much as allowed in the specification. This has no relationship to how |
da358b2602ce
Clarify comment block and rewrite in better English.
diego
parents:
5836
diff
changeset
|
885 * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large |
da358b2602ce
Clarify comment block and rewrite in better English.
diego
parents:
5836
diff
changeset
|
886 * enough for such valid streams). |
da358b2602ce
Clarify comment block and rewrite in better English.
diego
parents:
5836
diff
changeset
|
887 * Plus, a decoder has to check stream validity and remove frames if too |
da358b2602ce
Clarify comment block and rewrite in better English.
diego
parents:
5836
diff
changeset
|
888 * many reference frames are around. Waiting for "OOM" is not correct at |
da358b2602ce
Clarify comment block and rewrite in better English.
diego
parents:
5836
diff
changeset
|
889 * all. Similarly, missing reference frames have to be replaced by |
da358b2602ce
Clarify comment block and rewrite in better English.
diego
parents:
5836
diff
changeset
|
890 * interpolated/MC frames, anything else is a bug in the codec ... |
da358b2602ce
Clarify comment block and rewrite in better English.
diego
parents:
5836
diff
changeset
|
891 */ |
5836
0859108b4ae3
replace (disabled by default) assert(0) by abort() if the picture buffer
michael
parents:
5798
diff
changeset
|
892 abort(); |
1586 | 893 return -1; |
924 | 894 } |
895 | |
1597 | 896 static void update_noise_reduction(MpegEncContext *s){ |
897 int intra, i; | |
898 | |
899 for(intra=0; intra<2; intra++){ | |
900 if(s->dct_count[intra] > (1<<16)){ | |
901 for(i=0; i<64; i++){ | |
902 s->dct_error_sum[intra][i] >>=1; | |
903 } | |
904 s->dct_count[intra] >>= 1; | |
905 } | |
2967 | 906 |
1597 | 907 for(i=0; i<64; i++){ |
908 s->dct_offset[intra][i]= (s->avctx->noise_reduction * s->dct_count[intra] + s->dct_error_sum[intra][i]/2) / (s->dct_error_sum[intra][i]+1); | |
909 } | |
910 } | |
911 } | |
912 | |
1586 | 913 /** |
914 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded | |
915 */ | |
771
d4cc92144266
handle direct rendering buffer allocation failure
michaelni
parents:
768
diff
changeset
|
916 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) |
0 | 917 { |
924 | 918 int i; |
9643 | 919 Picture *pic; |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2627
diff
changeset
|
920 s->mb_skipped = 0; |
1168 | 921 |
1234 | 922 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3); |
1228 | 923 |
903 | 924 /* mark&release old frames */ |
6481 | 925 if (s->pict_type != FF_B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) { |
4396
8e78248586b0
set last_picture for h.264 too, this significantly improves error concealment quality, i hope it doesnt break anything as last_picture_ptr was always NULL for h.264
michael
parents:
4346
diff
changeset
|
926 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){ |
9124 | 927 free_frame_buffer(s, s->last_picture_ptr); |
903 | 928 |
929 /* release forgotten pictures */ | |
930 /* if(mpeg124/h263) */ | |
931 if(!s->encoding){ | |
932 for(i=0; i<MAX_PICTURE_COUNT; i++){ | |
1138 | 933 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
934 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n"); |
9124 | 935 free_frame_buffer(s, &s->picture[i]); |
903 | 936 } |
937 } | |
938 } | |
4396
8e78248586b0
set last_picture for h.264 too, this significantly improves error concealment quality, i hope it doesnt break anything as last_picture_ptr was always NULL for h.264
michael
parents:
4346
diff
changeset
|
939 } |
903 | 940 } |
10606
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
941 |
910
eb448df811be
fixing files where the first frame isn a keyframe
michaelni
parents:
909
diff
changeset
|
942 if(!s->encoding){ |
2764 | 943 /* release non reference frames */ |
1228 | 944 for(i=0; i<MAX_PICTURE_COUNT; i++){ |
945 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){ | |
9124 | 946 free_frame_buffer(s, &s->picture[i]); |
1228 | 947 } |
948 } | |
949 | |
1586 | 950 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL) |
9643 | 951 pic= s->current_picture_ptr; //we already have a unused image (maybe it was set before reading the header) |
1586 | 952 else{ |
953 i= ff_find_unused_picture(s, 0); | |
9643 | 954 pic= &s->picture[i]; |
1586 | 955 } |
956 | |
5723
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5712
diff
changeset
|
957 pic->reference= 0; |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5712
diff
changeset
|
958 if (!s->dropable){ |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5712
diff
changeset
|
959 if (s->codec_id == CODEC_ID_H264) |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5712
diff
changeset
|
960 pic->reference = s->picture_structure; |
6481 | 961 else if (s->pict_type != FF_B_TYPE) |
5723
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5712
diff
changeset
|
962 pic->reference = 3; |
49a5d44423ef
h264/PAFF preparation: use DELAYED_PIC_REF to mark non-refs frames as held for delayed output
andoma
parents:
5712
diff
changeset
|
963 } |
1138 | 964 |
1705 | 965 pic->coded_picture_number= s->coded_picture_number++; |
2967 | 966 |
9721
5d0f71ba8648
Rename alloc_picture to ff_alloc_picture and move its definition
bcoudurier
parents:
9644
diff
changeset
|
967 if(ff_alloc_picture(s, pic, 0) < 0) |
1384 | 968 return -1; |
903 | 969 |
9643 | 970 s->current_picture_ptr= pic; |
1658 | 971 s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic |
1659 | 972 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence; |
903 | 973 } |
456 | 974 |
1173 | 975 s->current_picture_ptr->pict_type= s->pict_type; |
2967 | 976 // if(s->flags && CODEC_FLAG_QSCALE) |
1505
010f76d07a27
use lagrange multipler instead of qp for ratecontrol, this may break some things, tell me ASAP if u notice anything broken
michaelni
parents:
1497
diff
changeset
|
977 // s->current_picture_ptr->quality= s->new_picture_ptr->quality; |
6481 | 978 s->current_picture_ptr->key_frame= s->pict_type == FF_I_TYPE; |
1173 | 979 |
7974 | 980 ff_copy_picture(&s->current_picture, s->current_picture_ptr); |
2967 | 981 |
6481 | 982 if (s->pict_type != FF_B_TYPE) { |
1138 | 983 s->last_picture_ptr= s->next_picture_ptr; |
1944 | 984 if(!s->dropable) |
985 s->next_picture_ptr= s->current_picture_ptr; | |
986 } | |
987 /* av_log(s->avctx, AV_LOG_DEBUG, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n", s->last_picture_ptr, s->next_picture_ptr,s->current_picture_ptr, | |
2967 | 988 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL, |
989 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL, | |
1944 | 990 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL, |
991 s->pict_type, s->dropable);*/ | |
2967 | 992 |
10606
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
993 if(s->codec_id != CODEC_ID_H264){ |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
994 if((s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) && s->pict_type!=FF_I_TYPE){ |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
995 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n"); |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
996 /* Allocate a dummy frame */ |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
997 i= ff_find_unused_picture(s, 0); |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
998 s->last_picture_ptr= &s->picture[i]; |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
999 if(ff_alloc_picture(s, s->last_picture_ptr, 0) < 0) |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
1000 return -1; |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
1001 } |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
1002 if((s->next_picture_ptr==NULL || s->next_picture_ptr->data[0]==NULL) && s->pict_type==FF_B_TYPE){ |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
1003 /* Allocate a dummy frame */ |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
1004 i= ff_find_unused_picture(s, 0); |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
1005 s->next_picture_ptr= &s->picture[i]; |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
1006 if(ff_alloc_picture(s, s->next_picture_ptr, 0) < 0) |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
1007 return -1; |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
1008 } |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
1009 } |
9ea5f2f1874f
Move dummy picture allocation code from mpeg1/2 to mpegvideo.
michael
parents:
10604
diff
changeset
|
1010 |
7974 | 1011 if(s->last_picture_ptr) ff_copy_picture(&s->last_picture, s->last_picture_ptr); |
1012 if(s->next_picture_ptr) ff_copy_picture(&s->next_picture, s->next_picture_ptr); | |
2967 | 1013 |
6481 | 1014 assert(s->pict_type == FF_I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0])); |
1393 | 1015 |
5798
7b058e5183ab
Manage Picture buffers for fields as well as frames. Pair complementary fields into one MPV Picture.
andoma
parents:
5788
diff
changeset
|
1016 if(s->picture_structure!=PICT_FRAME && s->out_format != FMT_H264){ |
1138 | 1017 int i; |
1018 for(i=0; i<4; i++){ | |
1019 if(s->picture_structure == PICT_BOTTOM_FIELD){ | |
1020 s->current_picture.data[i] += s->current_picture.linesize[i]; | |
2967 | 1021 } |
1138 | 1022 s->current_picture.linesize[i] *= 2; |
1023 s->last_picture.linesize[i] *=2; | |
1024 s->next_picture.linesize[i] *=2; | |
1025 } | |
553 | 1026 } |
2967 | 1027 |
910
eb448df811be
fixing files where the first frame isn a keyframe
michaelni
parents:
909
diff
changeset
|
1028 s->hurry_up= s->avctx->hurry_up; |
7831 | 1029 s->error_recognition= avctx->error_recognition; |
910
eb448df811be
fixing files where the first frame isn a keyframe
michaelni
parents:
909
diff
changeset
|
1030 |
2764 | 1031 /* set dequantizer, we can't do it during init as it might change for mpeg4 |
5127 | 1032 and we can't do it in the header decode as init is not called for mpeg4 there yet */ |
1689 | 1033 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){ |
1034 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra; | |
1035 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter; | |
2345 | 1036 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){ |
1689 | 1037 s->dct_unquantize_intra = s->dct_unquantize_h263_intra; |
1038 s->dct_unquantize_inter = s->dct_unquantize_h263_inter; | |
1039 }else{ | |
1040 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra; | |
1041 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter; | |
1042 } | |
771
d4cc92144266
handle direct rendering buffer allocation failure
michaelni
parents:
768
diff
changeset
|
1043 |
1597 | 1044 if(s->dct_error_sum){ |
1045 assert(s->avctx->noise_reduction && s->encoding); | |
1046 | |
1047 update_noise_reduction(s); | |
1048 } | |
2967 | 1049 |
8948
886ef38c7b36
Get rid of some '#if CONFIG_MPEG_XVMC_DECODER' preprocessor checks around if
diego
parents:
8881
diff
changeset
|
1050 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration) |
8857
9cd28fb52745
Fix compilation: XVMC_ --> ff_xvmc prefix for xvmc functions.
diego
parents:
8855
diff
changeset
|
1051 return ff_xvmc_field_start(s, avctx); |
8948
886ef38c7b36
Get rid of some '#if CONFIG_MPEG_XVMC_DECODER' preprocessor checks around if
diego
parents:
8881
diff
changeset
|
1052 |
771
d4cc92144266
handle direct rendering buffer allocation failure
michaelni
parents:
768
diff
changeset
|
1053 return 0; |
0 | 1054 } |
13
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
1055 |
0 | 1056 /* generic function for encode/decode called after a frame has been coded/decoded */ |
1057 void MPV_frame_end(MpegEncContext *s) | |
1058 { | |
903 | 1059 int i; |
0 | 1060 /* draw edge for correct motion prediction if outside */ |
8949
c6aff37981b6
whitespace cosmetics: Reindent a few lines after the last commit.
diego
parents:
8948
diff
changeset
|
1061 //just to make sure that all data is rendered. |
8948
886ef38c7b36
Get rid of some '#if CONFIG_MPEG_XVMC_DECODER' preprocessor checks around if
diego
parents:
8881
diff
changeset
|
1062 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){ |
8857
9cd28fb52745
Fix compilation: XVMC_ --> ff_xvmc prefix for xvmc functions.
diego
parents:
8855
diff
changeset
|
1063 ff_xvmc_field_end(s); |
9011
90c99bda19f5
Approved hunks for VAAPI / our new shiny hwaccel API
michael
parents:
9007
diff
changeset
|
1064 }else if(!s->avctx->hwaccel |
90c99bda19f5
Approved hunks for VAAPI / our new shiny hwaccel API
michael
parents:
9007
diff
changeset
|
1065 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) |
8522
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8359
diff
changeset
|
1066 && s->unrestricted_mv |
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8359
diff
changeset
|
1067 && s->current_picture.reference |
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8359
diff
changeset
|
1068 && !s->intra_only |
f8c091bb5779
Add VDPAU hardware accelerated decoding for H264 which can be used by
cehoyos
parents:
8359
diff
changeset
|
1069 && !(s->flags&CODEC_FLAG_EMU_EDGE)) { |
6437 | 1070 s->dsp.draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH ); |
1071 s->dsp.draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2); | |
1072 s->dsp.draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2); | |
0 | 1073 } |
207 | 1074 emms_c(); |
2967 | 1075 |
612 | 1076 s->last_pict_type = s->pict_type; |
2997
188f4ef688f2
second try of improved lambda/qp guessing for motion estimation RD in first pass
michael
parents:
2990
diff
changeset
|
1077 s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality; |
6481 | 1078 if(s->pict_type!=FF_B_TYPE){ |
329 | 1079 s->last_non_b_pict_type= s->pict_type; |
1080 } | |
1138 | 1081 #if 0 |
1082 /* copy back current_picture variables */ | |
903 | 1083 for(i=0; i<MAX_PICTURE_COUNT; i++){ |
1084 if(s->picture[i].data[0] == s->current_picture.data[0]){ | |
1085 s->picture[i]= s->current_picture; | |
1086 break; | |
2967 | 1087 } |
903 | 1088 } |
1089 assert(i<MAX_PICTURE_COUNT); | |
2967 | 1090 #endif |
903 | 1091 |
1228 | 1092 if(s->encoding){ |
2764 | 1093 /* release non-reference frames */ |
1228 | 1094 for(i=0; i<MAX_PICTURE_COUNT; i++){ |
1095 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){ | |
9124 | 1096 free_frame_buffer(s, &s->picture[i]); |
1228 | 1097 } |
1098 } | |
324 | 1099 } |
1138 | 1100 // clear copies, to avoid confusion |
1101 #if 0 | |
1102 memset(&s->last_picture, 0, sizeof(Picture)); | |
1103 memset(&s->next_picture, 0, sizeof(Picture)); | |
1104 memset(&s->current_picture, 0, sizeof(Picture)); | |
1105 #endif | |
2213 | 1106 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr; |
903 | 1107 } |
1108 | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1109 /** |
1285 | 1110 * draws an line from (ex, ey) -> (sx, sy). |
1111 * @param w width of the image | |
1112 * @param h height of the image | |
1113 * @param stride stride/linesize of the image | |
1114 * @param color color of the arrow | |
1115 */ | |
1116 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){ | |
3595 | 1117 int x, y, fr, f; |
2967 | 1118 |
4594 | 1119 sx= av_clip(sx, 0, w-1); |
1120 sy= av_clip(sy, 0, h-1); | |
1121 ex= av_clip(ex, 0, w-1); | |
1122 ey= av_clip(ey, 0, h-1); | |
2967 | 1123 |
1285 | 1124 buf[sy*stride + sx]+= color; |
2967 | 1125 |
4001 | 1126 if(FFABS(ex - sx) > FFABS(ey - sy)){ |
1285 | 1127 if(sx > ex){ |
4120 | 1128 FFSWAP(int, sx, ex); |
1129 FFSWAP(int, sy, ey); | |
1285 | 1130 } |
1131 buf+= sx + sy*stride; | |
1132 ex-= sx; | |
1133 f= ((ey-sy)<<16)/ex; | |
1134 for(x= 0; x <= ex; x++){ | |
1918
ea20f38b8d57
nicer looking arrows for the motion vector vissualization
michael
parents:
1916
diff
changeset
|
1135 y = (x*f)>>16; |
ea20f38b8d57
nicer looking arrows for the motion vector vissualization
michael
parents:
1916
diff
changeset
|
1136 fr= (x*f)&0xFFFF; |
ea20f38b8d57
nicer looking arrows for the motion vector vissualization
michael
parents:
1916
diff
changeset
|
1137 buf[ y *stride + x]+= (color*(0x10000-fr))>>16; |
ea20f38b8d57
nicer looking arrows for the motion vector vissualization
michael
parents:
1916
diff
changeset
|
1138 buf[(y+1)*stride + x]+= (color* fr )>>16; |
1285 | 1139 } |
1140 }else{ | |
1141 if(sy > ey){ | |
4120 | 1142 FFSWAP(int, sx, ex); |
1143 FFSWAP(int, sy, ey); | |
1285 | 1144 } |
1145 buf+= sx + sy*stride; | |
1146 ey-= sy; | |
1147 if(ey) f= ((ex-sx)<<16)/ey; | |
1148 else f= 0; | |
1149 for(y= 0; y <= ey; y++){ | |
1918
ea20f38b8d57
nicer looking arrows for the motion vector vissualization
michael
parents:
1916
diff
changeset
|
1150 x = (y*f)>>16; |
ea20f38b8d57
nicer looking arrows for the motion vector vissualization
michael
parents:
1916
diff
changeset
|
1151 fr= (y*f)&0xFFFF; |
6377 | 1152 buf[y*stride + x ]+= (color*(0x10000-fr))>>16; |
1153 buf[y*stride + x+1]+= (color* fr )>>16; | |
1285 | 1154 } |
1155 } | |
1156 } | |
1157 | |
1158 /** | |
1159 * draws an arrow from (ex, ey) -> (sx, sy). | |
1160 * @param w width of the image | |
1161 * @param h height of the image | |
1162 * @param stride stride/linesize of the image | |
1163 * @param color color of the arrow | |
1164 */ | |
2967 | 1165 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){ |
1285 | 1166 int dx,dy; |
1167 | |
4594 | 1168 sx= av_clip(sx, -100, w+100); |
1169 sy= av_clip(sy, -100, h+100); | |
1170 ex= av_clip(ex, -100, w+100); | |
1171 ey= av_clip(ey, -100, h+100); | |
2967 | 1172 |
1285 | 1173 dx= ex - sx; |
1174 dy= ey - sy; | |
2967 | 1175 |
1285 | 1176 if(dx*dx + dy*dy > 3*3){ |
1177 int rx= dx + dy; | |
1178 int ry= -dx + dy; | |
1179 int length= ff_sqrt((rx*rx + ry*ry)<<8); | |
2967 | 1180 |
1285 | 1181 //FIXME subpixel accuracy |
1182 rx= ROUNDED_DIV(rx*3<<4, length); | |
1183 ry= ROUNDED_DIV(ry*3<<4, length); | |
2967 | 1184 |
1285 | 1185 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color); |
1186 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color); | |
1187 } | |
1188 draw_line(buf, sx, sy, ex, ey, w, h, stride, color); | |
1189 } | |
1190 | |
1191 /** | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1192 * prints debuging info for the given picture. |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1193 */ |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1194 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){ |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1195 |
9089
bea68afbf199
Merge three conditions in a single 'if' instead of two.
benoit
parents:
9068
diff
changeset
|
1196 if(s->avctx->hwaccel || !pict || !pict->mb_type) return; |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1197 |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1198 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){ |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1199 int x,y; |
2967 | 1200 |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1201 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: "); |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1202 switch (pict->pict_type) { |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1203 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1204 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1205 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1206 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1207 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break; |
2967 | 1208 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break; |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1209 } |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1210 for(y=0; y<s->mb_height; y++){ |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1211 for(x=0; x<s->mb_width; x++){ |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1212 if(s->avctx->debug&FF_DEBUG_SKIP){ |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1213 int count= s->mbskip_table[x + y*s->mb_stride]; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1214 if(count>9) count=9; |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1215 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1216 } |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1217 if(s->avctx->debug&FF_DEBUG_QP){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1218 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1219 } |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1220 if(s->avctx->debug&FF_DEBUG_MB_TYPE){ |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1221 int mb_type= pict->mb_type[x + y*s->mb_stride]; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1222 //Type & MV direction |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1223 if(IS_PCM(mb_type)) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1224 av_log(s->avctx, AV_LOG_DEBUG, "P"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1225 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type)) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1226 av_log(s->avctx, AV_LOG_DEBUG, "A"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1227 else if(IS_INTRA4x4(mb_type)) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1228 av_log(s->avctx, AV_LOG_DEBUG, "i"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1229 else if(IS_INTRA16x16(mb_type)) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1230 av_log(s->avctx, AV_LOG_DEBUG, "I"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1231 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1232 av_log(s->avctx, AV_LOG_DEBUG, "d"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1233 else if(IS_DIRECT(mb_type)) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1234 av_log(s->avctx, AV_LOG_DEBUG, "D"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1235 else if(IS_GMC(mb_type) && IS_SKIP(mb_type)) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1236 av_log(s->avctx, AV_LOG_DEBUG, "g"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1237 else if(IS_GMC(mb_type)) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1238 av_log(s->avctx, AV_LOG_DEBUG, "G"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1239 else if(IS_SKIP(mb_type)) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1240 av_log(s->avctx, AV_LOG_DEBUG, "S"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1241 else if(!USES_LIST(mb_type, 1)) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1242 av_log(s->avctx, AV_LOG_DEBUG, ">"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1243 else if(!USES_LIST(mb_type, 0)) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1244 av_log(s->avctx, AV_LOG_DEBUG, "<"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1245 else{ |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1246 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1)); |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1247 av_log(s->avctx, AV_LOG_DEBUG, "X"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1248 } |
2967 | 1249 |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1250 //segmentation |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1251 if(IS_8X8(mb_type)) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1252 av_log(s->avctx, AV_LOG_DEBUG, "+"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1253 else if(IS_16X8(mb_type)) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1254 av_log(s->avctx, AV_LOG_DEBUG, "-"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1255 else if(IS_8X16(mb_type)) |
2677 | 1256 av_log(s->avctx, AV_LOG_DEBUG, "|"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1257 else if(IS_INTRA(mb_type) || IS_16X16(mb_type)) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1258 av_log(s->avctx, AV_LOG_DEBUG, " "); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1259 else |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1260 av_log(s->avctx, AV_LOG_DEBUG, "?"); |
2967 | 1261 |
1262 | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1263 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264) |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1264 av_log(s->avctx, AV_LOG_DEBUG, "="); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1265 else |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1266 av_log(s->avctx, AV_LOG_DEBUG, " "); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1267 } |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1268 // av_log(s->avctx, AV_LOG_DEBUG, " "); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1269 } |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1597
diff
changeset
|
1270 av_log(s->avctx, AV_LOG_DEBUG, "\n"); |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1271 } |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1272 } |
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1662
diff
changeset
|
1273 |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1274 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){ |
1285 | 1275 const int shift= 1 + s->quarter_sample; |
1276 int mb_y; | |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1277 uint8_t *ptr; |
1707 | 1278 int i; |
7456
211cca1e3f39
fix mpeg 4:2:2 vis_qp and vis_mb_type debug, fix issue #471
bcoudurier
parents:
7377
diff
changeset
|
1279 int h_chroma_shift, v_chroma_shift, block_height; |
2266
514949de5d15
set AVCodecContext.width/height to the picture width/height instead of the one stored in the bitstream (that only matters if lowres!=0)
michael
parents:
2265
diff
changeset
|
1280 const int width = s->avctx->width; |
514949de5d15
set AVCodecContext.width/height to the picture width/height instead of the one stored in the bitstream (that only matters if lowres!=0)
michael
parents:
2265
diff
changeset
|
1281 const int height= s->avctx->height; |
2395 | 1282 const int mv_sample_log2= 4 - pict->motion_subsample_log2; |
3268 | 1283 const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1); |
1285 | 1284 s->low_delay=0; //needed to see the vectors without trashing the buffers |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1285 |
1723
033d889d7c2c
non YV12 vissualization fix by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1722
diff
changeset
|
1286 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift); |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1287 for(i=0; i<3; i++){ |
2266
514949de5d15
set AVCodecContext.width/height to the picture width/height instead of the one stored in the bitstream (that only matters if lowres!=0)
michael
parents:
2265
diff
changeset
|
1288 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift); |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1289 pict->data[i]= s->visualization_buffer[i]; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1290 } |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1291 pict->type= FF_BUFFER_TYPE_COPY; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1292 ptr= pict->data[0]; |
7456
211cca1e3f39
fix mpeg 4:2:2 vis_qp and vis_mb_type debug, fix issue #471
bcoudurier
parents:
7377
diff
changeset
|
1293 block_height = 16>>v_chroma_shift; |
1285 | 1294 |
1295 for(mb_y=0; mb_y<s->mb_height; mb_y++){ | |
1296 int mb_x; | |
1297 for(mb_x=0; mb_x<s->mb_width; mb_x++){ | |
1298 const int mb_index= mb_x + mb_y*s->mb_stride; | |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1299 if((s->avctx->debug_mv) && pict->motion_val){ |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1300 int type; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1301 for(type=0; type<3; type++){ |
2024
f65d87bfdd5a
some of the warning fixes by (Michael Roitzsch <mroi at users dot sourceforge dot net>)
michael
parents:
2015
diff
changeset
|
1302 int direction = 0; |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1303 switch (type) { |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1304 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE)) |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1305 continue; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1306 direction = 0; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1307 break; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1308 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE)) |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1309 continue; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1310 direction = 0; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1311 break; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1312 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE)) |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1313 continue; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1314 direction = 1; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1315 break; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1316 } |
1712 | 1317 if(!USES_LIST(pict->mb_type[mb_index], direction)) |
1318 continue; | |
1319 | |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1320 if(IS_8X8(pict->mb_type[mb_index])){ |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1321 int i; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1322 for(i=0; i<4; i++){ |
1285 | 1323 int sx= mb_x*16 + 4 + 8*(i&1); |
1324 int sy= mb_y*16 + 4 + 8*(i>>1); | |
2522
e25782262d7d
kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
2514
diff
changeset
|
1325 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1); |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1326 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1327 int my= (pict->motion_val[direction][xy][1]>>shift) + sy; |
2266
514949de5d15
set AVCodecContext.width/height to the picture width/height instead of the one stored in the bitstream (that only matters if lowres!=0)
michael
parents:
2265
diff
changeset
|
1328 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100); |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1329 } |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1330 }else if(IS_16X8(pict->mb_type[mb_index])){ |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1331 int i; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1332 for(i=0; i<2; i++){ |
1629
74685a0ec851
16x8 MV vissualization by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1628
diff
changeset
|
1333 int sx=mb_x*16 + 8; |
74685a0ec851
16x8 MV vissualization by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1628
diff
changeset
|
1334 int sy=mb_y*16 + 4 + 8*i; |
2522
e25782262d7d
kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
2514
diff
changeset
|
1335 int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1); |
2395 | 1336 int mx=(pict->motion_val[direction][xy][0]>>shift); |
1337 int my=(pict->motion_val[direction][xy][1]>>shift); | |
2967 | 1338 |
2395 | 1339 if(IS_INTERLACED(pict->mb_type[mb_index])) |
1340 my*=2; | |
2967 | 1341 |
2395 | 1342 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100); |
1343 } | |
1344 }else if(IS_8X16(pict->mb_type[mb_index])){ | |
1345 int i; | |
1346 for(i=0; i<2; i++){ | |
1347 int sx=mb_x*16 + 4 + 8*i; | |
1348 int sy=mb_y*16 + 8; | |
2522
e25782262d7d
kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
2514
diff
changeset
|
1349 int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1); |
1947
b306574523ad
fix y scale of mv vissualization of interlaced MVs
michael
parents:
1945
diff
changeset
|
1350 int mx=(pict->motion_val[direction][xy][0]>>shift); |
b306574523ad
fix y scale of mv vissualization of interlaced MVs
michael
parents:
1945
diff
changeset
|
1351 int my=(pict->motion_val[direction][xy][1]>>shift); |
2967 | 1352 |
1947
b306574523ad
fix y scale of mv vissualization of interlaced MVs
michael
parents:
1945
diff
changeset
|
1353 if(IS_INTERLACED(pict->mb_type[mb_index])) |
b306574523ad
fix y scale of mv vissualization of interlaced MVs
michael
parents:
1945
diff
changeset
|
1354 my*=2; |
2967 | 1355 |
2266
514949de5d15
set AVCodecContext.width/height to the picture width/height instead of the one stored in the bitstream (that only matters if lowres!=0)
michael
parents:
2265
diff
changeset
|
1356 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100); |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1357 } |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1358 }else{ |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1359 int sx= mb_x*16 + 8; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1360 int sy= mb_y*16 + 8; |
2395 | 1361 int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2; |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1362 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx; |
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1705
diff
changeset
|
1363 int my= (pict->motion_val[direction][xy][1]>>shift) + sy; |
2266
514949de5d15
set AVCodecContext.width/height to the picture width/height instead of the one stored in the bitstream (that only matters if lowres!=0)
michael
parents:
2265
diff
changeset
|
1364 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100); |
1629
74685a0ec851
16x8 MV vissualization by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1628
diff
changeset
|
1365 } |
2967 | 1366 } |
1685 | 1367 } |
1368 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){ | |
1369 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL; | |
1370 int y; | |
7456
211cca1e3f39
fix mpeg 4:2:2 vis_qp and vis_mb_type debug, fix issue #471
bcoudurier
parents:
7377
diff
changeset
|
1371 for(y=0; y<block_height; y++){ |
211cca1e3f39
fix mpeg 4:2:2 vis_qp and vis_mb_type debug, fix issue #471
bcoudurier
parents:
7377
diff
changeset
|
1372 *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= c; |
211cca1e3f39
fix mpeg 4:2:2 vis_qp and vis_mb_type debug, fix issue #471
bcoudurier
parents:
7377
diff
changeset
|
1373 *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= c; |
1685 | 1374 } |
1375 } | |
1376 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){ | |
1377 int mb_type= pict->mb_type[mb_index]; | |
1378 uint64_t u,v; | |
1379 int y; | |
1380 #define COLOR(theta, r)\ | |
1381 u= (int)(128 + r*cos(theta*3.141592/180));\ | |
1382 v= (int)(128 + r*sin(theta*3.141592/180)); | |
1383 | |
2967 | 1384 |
1685 | 1385 u=v=128; |
1386 if(IS_PCM(mb_type)){ | |
1387 COLOR(120,48) | |
1388 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){ | |
1389 COLOR(30,48) | |
1390 }else if(IS_INTRA4x4(mb_type)){ | |
1391 COLOR(90,48) | |
1392 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){ | |
1393 // COLOR(120,48) | |
1394 }else if(IS_DIRECT(mb_type)){ | |
1395 COLOR(150,48) | |
1396 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){ | |
1397 COLOR(170,48) | |
1398 }else if(IS_GMC(mb_type)){ | |
1399 COLOR(190,48) | |
1400 }else if(IS_SKIP(mb_type)){ | |
1401 // COLOR(180,48) | |
1402 }else if(!USES_LIST(mb_type, 1)){ | |
1403 COLOR(240,48) | |
1404 }else if(!USES_LIST(mb_type, 0)){ | |
1405 COLOR(0,48) | |
1406 }else{ | |
1407 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1)); | |
1408 COLOR(300,48) | |
1409 } | |
1410 | |
1411 u*= 0x0101010101010101ULL; | |
1412 v*= 0x0101010101010101ULL; | |
7456
211cca1e3f39
fix mpeg 4:2:2 vis_qp and vis_mb_type debug, fix issue #471
bcoudurier
parents:
7377
diff
changeset
|
1413 for(y=0; y<block_height; y++){ |
211cca1e3f39
fix mpeg 4:2:2 vis_qp and vis_mb_type debug, fix issue #471
bcoudurier
parents:
7377
diff
changeset
|
1414 *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= u; |
211cca1e3f39
fix mpeg 4:2:2 vis_qp and vis_mb_type debug, fix issue #471
bcoudurier
parents:
7377
diff
changeset
|
1415 *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= v; |
1685 | 1416 } |
1417 | |
1418 //segmentation | |
1419 if(IS_8X8(mb_type) || IS_16X8(mb_type)){ | |
1420 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL; | |
1421 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL; | |
1422 } | |
1423 if(IS_8X8(mb_type) || IS_8X16(mb_type)){ | |
1424 for(y=0; y<16; y++) | |
1425 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80; | |
1426 } | |
2534 | 1427 if(IS_8X8(mb_type) && mv_sample_log2 >= 2){ |
1428 int dm= 1 << (mv_sample_log2-2); | |
1429 for(i=0; i<4; i++){ | |
1430 int sx= mb_x*16 + 8*(i&1); | |
1431 int sy= mb_y*16 + 8*(i>>1); | |
1432 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1); | |
1433 //FIXME bidir | |
1434 int32_t *mv = (int32_t*)&pict->motion_val[0][xy]; | |
1435 if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)]) | |
1436 for(y=0; y<8; y++) | |
1437 pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80; | |
1438 if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)]) | |
1439 *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL; | |
1440 } | |
1441 } | |
2967 | 1442 |
1685 | 1443 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){ |
1444 // hmm | |
1445 } | |
1285 | 1446 } |
1447 s->mbskip_table[mb_index]=0; | |
1448 } | |
1449 } | |
1450 } | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1451 } |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1452 |
2967 | 1453 static inline int hpel_motion_lowres(MpegEncContext *s, |
2292 | 1454 uint8_t *dest, uint8_t *src, |
1455 int field_based, int field_select, | |
1456 int src_x, int src_y, | |
1457 int width, int height, int stride, | |
1458 int h_edge_pos, int v_edge_pos, | |
1459 int w, int h, h264_chroma_mc_func *pix_op, | |
1460 int motion_x, int motion_y) | |
1461 { | |
1462 const int lowres= s->avctx->lowres; | |
10894 | 1463 const int op_index= FFMIN(lowres, 2); |
2292 | 1464 const int s_mask= (2<<lowres)-1; |
1465 int emu=0; | |
1466 int sx, sy; | |
1467 | |
1468 if(s->quarter_sample){ | |
1469 motion_x/=2; | |
1470 motion_y/=2; | |
1471 } | |
1472 | |
1473 sx= motion_x & s_mask; | |
1474 sy= motion_y & s_mask; | |
1475 src_x += motion_x >> (lowres+1); | |
1476 src_y += motion_y >> (lowres+1); | |
2967 | 1477 |
2292 | 1478 src += src_y * stride + src_x; |
1479 | |
1480 if( (unsigned)src_x > h_edge_pos - (!!sx) - w | |
1481 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){ | |
1482 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based, | |
1483 src_x, src_y<<field_based, h_edge_pos, v_edge_pos); | |
1484 src= s->edge_emu_buffer; | |
1485 emu=1; | |
1486 } | |
1487 | |
10894 | 1488 sx= (sx << 2) >> lowres; |
1489 sy= (sy << 2) >> lowres; | |
2292 | 1490 if(field_select) |
1491 src += s->linesize; | |
10894 | 1492 pix_op[op_index](dest, src, stride, h, sx, sy); |
2292 | 1493 return emu; |
1494 } | |
1495 | |
0 | 1496 /* apply one mpeg motion vector to the three components */ |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4281
diff
changeset
|
1497 static av_always_inline void mpeg_motion_lowres(MpegEncContext *s, |
2256 | 1498 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, |
1499 int field_based, int bottom_field, int field_select, | |
1500 uint8_t **ref_picture, h264_chroma_mc_func *pix_op, | |
10604 | 1501 int motion_x, int motion_y, int h, int mb_y) |
2256 | 1502 { |
1503 uint8_t *ptr_y, *ptr_cb, *ptr_cr; | |
1504 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy; | |
1505 const int lowres= s->avctx->lowres; | |
10894 | 1506 const int op_index= FFMIN(lowres, 2); |
2256 | 1507 const int block_s= 8>>lowres; |
1508 const int s_mask= (2<<lowres)-1; | |
1509 const int h_edge_pos = s->h_edge_pos >> lowres; | |
1510 const int v_edge_pos = s->v_edge_pos >> lowres; | |
1511 linesize = s->current_picture.linesize[0] << field_based; | |
1512 uvlinesize = s->current_picture.linesize[1] << field_based; | |
1513 | |
7377
3f819263176e
cosmetics: Fix two common typos: wont --> will not, lets --> let us.
diego
parents:
6940
diff
changeset
|
1514 if(s->quarter_sample){ //FIXME obviously not perfect but qpel will not work in lowres anyway |
2260 | 1515 motion_x/=2; |
1516 motion_y/=2; | |
1517 } | |
2967 | 1518 |
2260 | 1519 if(field_based){ |
1520 motion_y += (bottom_field - field_select)*((1<<lowres)-1); | |
1521 } | |
1522 | |
2256 | 1523 sx= motion_x & s_mask; |
1524 sy= motion_y & s_mask; | |
1525 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1)); | |
10604 | 1526 src_y =( mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1)); |
2967 | 1527 |
2256 | 1528 if (s->out_format == FMT_H263) { |
2265 | 1529 uvsx = ((motion_x>>1) & s_mask) | (sx&1); |
1530 uvsy = ((motion_y>>1) & s_mask) | (sy&1); | |
2256 | 1531 uvsrc_x = src_x>>1; |
1532 uvsrc_y = src_y>>1; | |
1533 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261 | |
1534 mx = motion_x / 4; | |
1535 my = motion_y / 4; | |
1536 uvsx = (2*mx) & s_mask; | |
1537 uvsy = (2*my) & s_mask; | |
1538 uvsrc_x = s->mb_x*block_s + (mx >> lowres); | |
10604 | 1539 uvsrc_y = mb_y*block_s + (my >> lowres); |
2256 | 1540 } else { |
1541 mx = motion_x / 2; | |
1542 my = motion_y / 2; | |
1543 uvsx = mx & s_mask; | |
1544 uvsy = my & s_mask; | |
1545 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1)); | |
10604 | 1546 uvsrc_y =( mb_y*block_s>>field_based) + (my >> (lowres+1)); |
2256 | 1547 } |
1548 | |
1549 ptr_y = ref_picture[0] + src_y * linesize + src_x; | |
1550 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x; | |
1551 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x; | |
1552 | |
1553 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s | |
1554 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){ | |
1555 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based, | |
1556 src_x, src_y<<field_based, h_edge_pos, v_edge_pos); | |
1557 ptr_y = s->edge_emu_buffer; | |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
1558 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
2256 | 1559 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize; |
2967 | 1560 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based, |
2256 | 1561 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1); |
2967 | 1562 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based, |
2256 | 1563 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1); |
1564 ptr_cb= uvbuf; | |
1565 ptr_cr= uvbuf+16; | |
1566 } | |
1567 } | |
1568 | |
2260 | 1569 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data |
1570 dest_y += s->linesize; | |
1571 dest_cb+= s->uvlinesize; | |
1572 dest_cr+= s->uvlinesize; | |
1573 } | |
1574 | |
1575 if(field_select){ | |
1576 ptr_y += s->linesize; | |
1577 ptr_cb+= s->uvlinesize; | |
1578 ptr_cr+= s->uvlinesize; | |
1579 } | |
1580 | |
10894 | 1581 sx= (sx << 2) >> lowres; |
1582 sy= (sy << 2) >> lowres; | |
2256 | 1583 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy); |
2967 | 1584 |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
1585 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
10894 | 1586 uvsx= (uvsx << 2) >> lowres; |
1587 uvsy= (uvsy << 2) >> lowres; | |
1588 pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy); | |
1589 pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy); | |
2256 | 1590 } |
2291 | 1591 //FIXME h261 lowres loop filter |
2256 | 1592 } |
1593 | |
2292 | 1594 static inline void chroma_4mv_motion_lowres(MpegEncContext *s, |
1595 uint8_t *dest_cb, uint8_t *dest_cr, | |
1596 uint8_t **ref_picture, | |
1597 h264_chroma_mc_func *pix_op, | |
1598 int mx, int my){ | |
1599 const int lowres= s->avctx->lowres; | |
10894 | 1600 const int op_index= FFMIN(lowres, 2); |
2292 | 1601 const int block_s= 8>>lowres; |
1602 const int s_mask= (2<<lowres)-1; | |
1603 const int h_edge_pos = s->h_edge_pos >> (lowres+1); | |
1604 const int v_edge_pos = s->v_edge_pos >> (lowres+1); | |
1605 int emu=0, src_x, src_y, offset, sx, sy; | |
1606 uint8_t *ptr; | |
2967 | 1607 |
2292 | 1608 if(s->quarter_sample){ |
1609 mx/=2; | |
1610 my/=2; | |
1611 } | |
1612 | |
1613 /* In case of 8X8, we construct a single chroma motion vector | |
1614 with a special rounding */ | |
1615 mx= ff_h263_round_chroma(mx); | |
1616 my= ff_h263_round_chroma(my); | |
2967 | 1617 |
2292 | 1618 sx= mx & s_mask; |
1619 sy= my & s_mask; | |
1620 src_x = s->mb_x*block_s + (mx >> (lowres+1)); | |
1621 src_y = s->mb_y*block_s + (my >> (lowres+1)); | |
2967 | 1622 |
2292 | 1623 offset = src_y * s->uvlinesize + src_x; |
1624 ptr = ref_picture[1] + offset; | |
1625 if(s->flags&CODEC_FLAG_EMU_EDGE){ | |
1626 if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s | |
1627 || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){ | |
1628 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos); | |
1629 ptr= s->edge_emu_buffer; | |
1630 emu=1; | |
1631 } | |
2967 | 1632 } |
10894 | 1633 sx= (sx << 2) >> lowres; |
1634 sy= (sy << 2) >> lowres; | |
1635 pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy); | |
2967 | 1636 |
2292 | 1637 ptr = ref_picture[2] + offset; |
1638 if(emu){ | |
1639 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos); | |
1640 ptr= s->edge_emu_buffer; | |
1641 } | |
10894 | 1642 pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy); |
2292 | 1643 } |
1644 | |
2256 | 1645 /** |
2764 | 1646 * motion compensation of a single macroblock |
2256 | 1647 * @param s context |
1648 * @param dest_y luma destination pointer | |
1649 * @param dest_cb chroma cb/u destination pointer | |
1650 * @param dest_cr chroma cr/v destination pointer | |
1651 * @param dir direction (0->forward, 1->backward) | |
1652 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture | |
12056
25e9cb2b9477
Fix misspelled parameter names in Doxygen documentation.
diego
parents:
12036
diff
changeset
|
1653 * @param pix_op halfpel motion compensation function (average or put normally) |
2256 | 1654 * the motion vectors are taken from s->mv and the MV type from s->mv_type |
1655 */ | |
2967 | 1656 static inline void MPV_motion_lowres(MpegEncContext *s, |
2256 | 1657 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, |
2967 | 1658 int dir, uint8_t **ref_picture, |
2256 | 1659 h264_chroma_mc_func *pix_op) |
1660 { | |
2292 | 1661 int mx, my; |
2260 | 1662 int mb_x, mb_y, i; |
1663 const int lowres= s->avctx->lowres; | |
2967 | 1664 const int block_s= 8>>lowres; |
2260 | 1665 |
1666 mb_x = s->mb_x; | |
1667 mb_y = s->mb_y; | |
1668 | |
1669 switch(s->mv_type) { | |
1670 case MV_TYPE_16X16: | |
2967 | 1671 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, |
2260 | 1672 0, 0, 0, |
1673 ref_picture, pix_op, | |
10604 | 1674 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y); |
2260 | 1675 break; |
2292 | 1676 case MV_TYPE_8X8: |
2260 | 1677 mx = 0; |
1678 my = 0; | |
1679 for(i=0;i<4;i++) { | |
2292 | 1680 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s, |
2260 | 1681 ref_picture[0], 0, 0, |
2292 | 1682 (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s, |
2260 | 1683 s->width, s->height, s->linesize, |
2292 | 1684 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres, |
1685 block_s, block_s, pix_op, | |
2260 | 1686 s->mv[dir][i][0], s->mv[dir][i][1]); |
1687 | |
1688 mx += s->mv[dir][i][0]; | |
1689 my += s->mv[dir][i][1]; | |
1690 } | |
1691 | |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
1692 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)) |
2292 | 1693 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my); |
1694 break; | |
2260 | 1695 case MV_TYPE_FIELD: |
1696 if (s->picture_structure == PICT_FRAME) { | |
2967 | 1697 /* top field */ |
2260 | 1698 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, |
1699 1, 0, s->field_select[dir][0], | |
1700 ref_picture, pix_op, | |
10604 | 1701 s->mv[dir][0][0], s->mv[dir][0][1], block_s, mb_y); |
2260 | 1702 /* bottom field */ |
1703 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, | |
1704 1, 1, s->field_select[dir][1], | |
1705 ref_picture, pix_op, | |
10604 | 1706 s->mv[dir][1][0], s->mv[dir][1][1], block_s, mb_y); |
2260 | 1707 } else { |
6481 | 1708 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != FF_B_TYPE && !s->first_field){ |
2260 | 1709 ref_picture= s->current_picture_ptr->data; |
2967 | 1710 } |
2260 | 1711 |
1712 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, | |
1713 0, 0, s->field_select[dir][0], | |
1714 ref_picture, pix_op, | |
10604 | 1715 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y>>1); |
2260 | 1716 } |
1717 break; | |
1718 case MV_TYPE_16X8: | |
1719 for(i=0; i<2; i++){ | |
1720 uint8_t ** ref2picture; | |
1721 | |
6481 | 1722 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == FF_B_TYPE || s->first_field){ |
2260 | 1723 ref2picture= ref_picture; |
1724 }else{ | |
1725 ref2picture= s->current_picture_ptr->data; | |
2967 | 1726 } |
1727 | |
1728 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, | |
2260 | 1729 0, 0, s->field_select[dir][i], |
1730 ref2picture, pix_op, | |
10604 | 1731 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s, mb_y>>1); |
2967 | 1732 |
2260 | 1733 dest_y += 2*block_s*s->linesize; |
1734 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize; | |
1735 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize; | |
2967 | 1736 } |
2260 | 1737 break; |
1738 case MV_TYPE_DMV: | |
1739 if(s->picture_structure == PICT_FRAME){ | |
1740 for(i=0; i<2; i++){ | |
1741 int j; | |
1742 for(j=0; j<2; j++){ | |
1743 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, | |
1744 1, j, j^i, | |
1745 ref_picture, pix_op, | |
10604 | 1746 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s, mb_y); |
2260 | 1747 } |
1748 pix_op = s->dsp.avg_h264_chroma_pixels_tab; | |
1749 } | |
1750 }else{ | |
1751 for(i=0; i<2; i++){ | |
2967 | 1752 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, |
2260 | 1753 0, 0, s->picture_structure != i+1, |
1754 ref_picture, pix_op, | |
10604 | 1755 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s, mb_y>>1); |
2260 | 1756 |
1757 // after put we make avg of the same block | |
1758 pix_op = s->dsp.avg_h264_chroma_pixels_tab; | |
1759 | |
1760 //opposite parity is always in the same frame if this is second field | |
1761 if(!s->first_field){ | |
2967 | 1762 ref_picture = s->current_picture_ptr->data; |
2260 | 1763 } |
1764 } | |
1765 } | |
1766 break; | |
1767 default: assert(0); | |
1768 } | |
2256 | 1769 } |
0 | 1770 |
1771 /* put block[] to dest[] */ | |
2967 | 1772 static inline void put_dct(MpegEncContext *s, |
1651 | 1773 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale) |
0 | 1774 { |
1689 | 1775 s->dct_unquantize_intra(s, block, i, qscale); |
1092 | 1776 s->dsp.idct_put (dest, line_size, block); |
0 | 1777 } |
1778 | |
1779 /* add block[] to dest[] */ | |
2967 | 1780 static inline void add_dct(MpegEncContext *s, |
1064 | 1781 DCTELEM *block, int i, uint8_t *dest, int line_size) |
0 | 1782 { |
1783 if (s->block_last_index[i] >= 0) { | |
1092 | 1784 s->dsp.idct_add (dest, line_size, block); |
481 | 1785 } |
1786 } | |
1787 | |
2967 | 1788 static inline void add_dequant_dct(MpegEncContext *s, |
1644 | 1789 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale) |
481 | 1790 { |
1791 if (s->block_last_index[i] >= 0) { | |
1689 | 1792 s->dct_unquantize_inter(s, block, i, qscale); |
324 | 1793 |
1092 | 1794 s->dsp.idct_add (dest, line_size, block); |
0 | 1795 } |
1796 } | |
1797 | |
456 | 1798 /** |
1799 * cleans dc, ac, coded_block for the current non intra MB | |
1800 */ | |
1801 void ff_clean_intra_table_entries(MpegEncContext *s) | |
1802 { | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
1803 int wrap = s->b8_stride; |
456 | 1804 int xy = s->block_index[0]; |
2967 | 1805 |
1806 s->dc_val[0][xy ] = | |
1807 s->dc_val[0][xy + 1 ] = | |
456 | 1808 s->dc_val[0][xy + wrap] = |
1809 s->dc_val[0][xy + 1 + wrap] = 1024; | |
1810 /* ac pred */ | |
1064 | 1811 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t)); |
1812 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t)); | |
456 | 1813 if (s->msmpeg4_version>=3) { |
1814 s->coded_block[xy ] = | |
1815 s->coded_block[xy + 1 ] = | |
1816 s->coded_block[xy + wrap] = | |
1817 s->coded_block[xy + 1 + wrap] = 0; | |
1818 } | |
1819 /* chroma */ | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
1820 wrap = s->mb_stride; |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
1821 xy = s->mb_x + s->mb_y * wrap; |
456 | 1822 s->dc_val[1][xy] = |
1823 s->dc_val[2][xy] = 1024; | |
1824 /* ac pred */ | |
1064 | 1825 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t)); |
1826 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t)); | |
2967 | 1827 |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
1828 s->mbintra_table[xy]= 0; |
456 | 1829 } |
1830 | |
0 | 1831 /* generic function called after a macroblock has been parsed by the |
1832 decoder or after it has been encoded by the encoder. | |
1833 | |
1834 Important variables used: | |
1835 s->mb_intra : true if intra macroblock | |
1836 s->mv_dir : motion vector direction | |
1837 s->mv_type : motion vector type | |
1838 s->mv : motion vector | |
1839 s->interlaced_dct : true if interlaced dct used (mpeg2) | |
1840 */ | |
6580 | 1841 static av_always_inline |
1842 void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], | |
6658 | 1843 int lowres_flag, int is_mpeg12) |
0 | 1844 { |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1173
diff
changeset
|
1845 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; |
8948
886ef38c7b36
Get rid of some '#if CONFIG_MPEG_XVMC_DECODER' preprocessor checks around if
diego
parents:
8881
diff
changeset
|
1846 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){ |
8855 | 1847 ff_xvmc_decode_mb(s);//xvmc uses pblocks |
1381 | 1848 return; |
1849 } | |
0 | 1850 |
1833
ba27ce284d07
export DCT coefficients patch by (Wolfgang Hesseler <wolfgang.hesseler at imk dot fraunhofer dot de>)
michael
parents:
1831
diff
changeset
|
1851 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) { |
ba27ce284d07
export DCT coefficients patch by (Wolfgang Hesseler <wolfgang.hesseler at imk dot fraunhofer dot de>)
michael
parents:
1831
diff
changeset
|
1852 /* save DCT coefficients */ |
ba27ce284d07
export DCT coefficients patch by (Wolfgang Hesseler <wolfgang.hesseler at imk dot fraunhofer dot de>)
michael
parents:
1831
diff
changeset
|
1853 int i,j; |
ba27ce284d07
export DCT coefficients patch by (Wolfgang Hesseler <wolfgang.hesseler at imk dot fraunhofer dot de>)
michael
parents:
1831
diff
changeset
|
1854 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6]; |
ba27ce284d07
export DCT coefficients patch by (Wolfgang Hesseler <wolfgang.hesseler at imk dot fraunhofer dot de>)
michael
parents:
1831
diff
changeset
|
1855 for(i=0; i<6; i++) |
ba27ce284d07
export DCT coefficients patch by (Wolfgang Hesseler <wolfgang.hesseler at imk dot fraunhofer dot de>)
michael
parents:
1831
diff
changeset
|
1856 for(j=0; j<64; j++) |
ba27ce284d07
export DCT coefficients patch by (Wolfgang Hesseler <wolfgang.hesseler at imk dot fraunhofer dot de>)
michael
parents:
1831
diff
changeset
|
1857 *dct++ = block[i][s->dsp.idct_permutation[j]]; |
ba27ce284d07
export DCT coefficients patch by (Wolfgang Hesseler <wolfgang.hesseler at imk dot fraunhofer dot de>)
michael
parents:
1831
diff
changeset
|
1858 } |
ba27ce284d07
export DCT coefficients patch by (Wolfgang Hesseler <wolfgang.hesseler at imk dot fraunhofer dot de>)
michael
parents:
1831
diff
changeset
|
1859 |
903 | 1860 s->current_picture.qscale_table[mb_xy]= s->qscale; |
108
1e4a4af694d1
exporting qscale data for postprocessing (for MPlayer)
arpi_esp
parents:
79
diff
changeset
|
1861 |
0 | 1862 /* update DC predictors for P macroblocks */ |
1863 if (!s->mb_intra) { | |
6658 | 1864 if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) { |
481 | 1865 if(s->mbintra_table[mb_xy]) |
456 | 1866 ff_clean_intra_table_entries(s); |
0 | 1867 } else { |
456 | 1868 s->last_dc[0] = |
1869 s->last_dc[1] = | |
0 | 1870 s->last_dc[2] = 128 << s->intra_dc_precision; |
1871 } | |
1872 } | |
6658 | 1873 else if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) |
481 | 1874 s->mbintra_table[mb_xy]=1; |
191
883f184537e6
AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents:
189
diff
changeset
|
1875 |
6481 | 1876 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==FF_B_TYPE) && s->avctx->mb_decision != FF_MB_DECISION_RD)) { //FIXME precalc |
1064 | 1877 uint8_t *dest_y, *dest_cb, *dest_cr; |
481 | 1878 int dct_linesize, dct_offset; |
651 | 1879 op_pixels_func (*op_pix)[4]; |
1880 qpel_mc_func (*op_qpix)[16]; | |
2627
bf158d23bbcc
Spelling errors patch by (Kevin Baragona | kevinmb500 gawab com)
michael
parents:
2620
diff
changeset
|
1881 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics |
1138 | 1882 const int uvlinesize= s->current_picture.linesize[1]; |
6481 | 1883 const int readable= s->pict_type != FF_B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag; |
2256 | 1884 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8; |
7
1d3ac9654178
added skip macroblock optimization (big perf win on black regions for example)
glantau
parents:
0
diff
changeset
|
1885 |
903 | 1886 /* avoid copy if macroblock skipped in last frame too */ |
1887 /* skip only during decoding as we might trash the buffers during encoding a bit */ | |
1888 if(!s->encoding){ | |
1064 | 1889 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy]; |
903 | 1890 const int age= s->current_picture.age; |
1891 | |
1892 assert(age); | |
1893 | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2627
diff
changeset
|
1894 if (s->mb_skipped) { |
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2627
diff
changeset
|
1895 s->mb_skipped= 0; |
6481 | 1896 assert(s->pict_type!=FF_I_TYPE); |
2967 | 1897 |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2627
diff
changeset
|
1898 (*mbskip_ptr) ++; /* indicate that this time we skipped it */ |
556 | 1899 if(*mbskip_ptr >99) *mbskip_ptr= 99; |
1900 | |
903 | 1901 /* if previous was skipped too, then nothing to do ! */ |
1021
2d7c9f5738de
trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents:
1014
diff
changeset
|
1902 if (*mbskip_ptr >= age && s->current_picture.reference){ |
2d7c9f5738de
trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents:
1014
diff
changeset
|
1903 return; |
903 | 1904 } |
1021
2d7c9f5738de
trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents:
1014
diff
changeset
|
1905 } else if(!s->current_picture.reference){ |
2d7c9f5738de
trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents:
1014
diff
changeset
|
1906 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */ |
2d7c9f5738de
trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents:
1014
diff
changeset
|
1907 if(*mbskip_ptr >99) *mbskip_ptr= 99; |
2d7c9f5738de
trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents:
1014
diff
changeset
|
1908 } else{ |
7
1d3ac9654178
added skip macroblock optimization (big perf win on black regions for example)
glantau
parents:
0
diff
changeset
|
1909 *mbskip_ptr = 0; /* not skipped */ |
1d3ac9654178
added skip macroblock optimization (big perf win on black regions for example)
glantau
parents:
0
diff
changeset
|
1910 } |
717 | 1911 } |
2967 | 1912 |
2074
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
1913 dct_linesize = linesize << s->interlaced_dct; |
2256 | 1914 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size; |
2967 | 1915 |
1632 | 1916 if(readable){ |
1917 dest_y= s->dest[0]; | |
1918 dest_cb= s->dest[1]; | |
1919 dest_cr= s->dest[2]; | |
1920 }else{ | |
1799 | 1921 dest_y = s->b_scratchpad; |
1834 | 1922 dest_cb= s->b_scratchpad+16*linesize; |
2074
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
1923 dest_cr= s->b_scratchpad+32*linesize; |
1632 | 1924 } |
2256 | 1925 |
0 | 1926 if (!s->mb_intra) { |
1927 /* motion handling */ | |
2627
bf158d23bbcc
Spelling errors patch by (Kevin Baragona | kevinmb500 gawab com)
michael
parents:
2620
diff
changeset
|
1928 /* decoding or more than one mb_type (MC was already done otherwise) */ |
1389 | 1929 if(!s->encoding){ |
2256 | 1930 if(lowres_flag){ |
1931 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab; | |
1932 | |
1933 if (s->mv_dir & MV_DIR_FORWARD) { | |
1934 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix); | |
1935 op_pix = s->dsp.avg_h264_chroma_pixels_tab; | |
1936 } | |
1937 if (s->mv_dir & MV_DIR_BACKWARD) { | |
1938 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix); | |
1939 } | |
324 | 1940 }else{ |
3807
6a40092eb9e6
approximate qpel functions: sacrifice some quality for some decoding speed. enabled on B-frames with -lavdopts fast.
lorenm
parents:
3780
diff
changeset
|
1941 op_qpix= s->me.qpel_put; |
6481 | 1942 if ((!s->no_rounding) || s->pict_type==FF_B_TYPE){ |
2256 | 1943 op_pix = s->dsp.put_pixels_tab; |
1944 }else{ | |
1945 op_pix = s->dsp.put_no_rnd_pixels_tab; | |
1946 } | |
1947 if (s->mv_dir & MV_DIR_FORWARD) { | |
1948 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix); | |
1949 op_pix = s->dsp.avg_pixels_tab; | |
3807
6a40092eb9e6
approximate qpel functions: sacrifice some quality for some decoding speed. enabled on B-frames with -lavdopts fast.
lorenm
parents:
3780
diff
changeset
|
1950 op_qpix= s->me.qpel_avg; |
2256 | 1951 } |
1952 if (s->mv_dir & MV_DIR_BACKWARD) { | |
1953 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix); | |
1954 } | |
324 | 1955 } |
0 | 1956 } |
1957 | |
481 | 1958 /* skip dequant / idct if we are really late ;) */ |
2792 | 1959 if(s->hurry_up>1) goto skip_idct; |
1960 if(s->avctx->skip_idct){ | |
6481 | 1961 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == FF_B_TYPE) |
1962 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != FF_I_TYPE) | |
2792 | 1963 || s->avctx->skip_idct >= AVDISCARD_ALL) |
1964 goto skip_idct; | |
1965 } | |
481 | 1966 |
0 | 1967 /* add dct residue */ |
1421 | 1968 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO |
711 | 1969 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){ |
2256 | 1970 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale); |
1971 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale); | |
1972 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale); | |
1973 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale); | |
0 | 1974 |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
1975 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
3309 | 1976 if (s->chroma_y_shift){ |
1977 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale); | |
1978 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale); | |
1979 }else{ | |
1980 dct_linesize >>= 1; | |
1981 dct_offset >>=1; | |
1982 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale); | |
1983 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale); | |
1984 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale); | |
1985 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale); | |
1986 } | |
485 | 1987 } |
6658 | 1988 } else if(is_mpeg12 || (s->codec_id != CODEC_ID_WMV2)){ |
2256 | 1989 add_dct(s, block[0], 0, dest_y , dct_linesize); |
1990 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize); | |
1991 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize); | |
1992 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize); | |
481 | 1993 |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
1994 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
2074
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
1995 if(s->chroma_y_shift){//Chroma420 |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
1996 add_dct(s, block[4], 4, dest_cb, uvlinesize); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
1997 add_dct(s, block[5], 5, dest_cr, uvlinesize); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
1998 }else{ |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
1999 //chroma422 |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2000 dct_linesize = uvlinesize << s->interlaced_dct; |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2001 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8; |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2002 |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2003 add_dct(s, block[4], 4, dest_cb, dct_linesize); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2004 add_dct(s, block[5], 5, dest_cr, dct_linesize); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2005 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2006 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2007 if(!s->chroma_x_shift){//Chroma444 |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2008 add_dct(s, block[8], 8, dest_cb+8, dct_linesize); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2009 add_dct(s, block[9], 9, dest_cr+8, dct_linesize); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2010 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2011 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2012 } |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2013 } |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2014 }//fi gray |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2015 } |
10745 | 2016 else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) { |
936 | 2017 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr); |
481 | 2018 } |
0 | 2019 } else { |
2020 /* dct only in intra block */ | |
1421 | 2021 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){ |
2256 | 2022 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale); |
2023 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale); | |
2024 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale); | |
2025 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale); | |
0 | 2026 |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
2027 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
3309 | 2028 if(s->chroma_y_shift){ |
2029 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale); | |
2030 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale); | |
2031 }else{ | |
2032 dct_offset >>=1; | |
2033 dct_linesize >>=1; | |
2034 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale); | |
2035 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale); | |
2036 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale); | |
2037 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale); | |
2038 } | |
711 | 2039 } |
2040 }else{ | |
2256 | 2041 s->dsp.idct_put(dest_y , dct_linesize, block[0]); |
2042 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]); | |
2043 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]); | |
2044 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]); | |
711 | 2045 |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
2046 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
2074
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2047 if(s->chroma_y_shift){ |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2048 s->dsp.idct_put(dest_cb, uvlinesize, block[4]); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2049 s->dsp.idct_put(dest_cr, uvlinesize, block[5]); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2050 }else{ |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2051 |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2052 dct_linesize = uvlinesize << s->interlaced_dct; |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2053 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8; |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2054 |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2055 s->dsp.idct_put(dest_cb, dct_linesize, block[4]); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2056 s->dsp.idct_put(dest_cr, dct_linesize, block[5]); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2057 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2058 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2059 if(!s->chroma_x_shift){//Chroma444 |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2060 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2061 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2062 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2063 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2064 } |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2065 } |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2066 }//gray |
485 | 2067 } |
0 | 2068 } |
2792 | 2069 skip_idct: |
1632 | 2070 if(!readable){ |
2071 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16); | |
2074
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2072 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift); |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2073 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift); |
1632 | 2074 } |
0 | 2075 } |
294 | 2076 } |
2077 | |
2256 | 2078 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){ |
8590 | 2079 #if !CONFIG_SMALL |
6658 | 2080 if(s->out_format == FMT_MPEG1) { |
2081 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1); | |
2082 else MPV_decode_mb_internal(s, block, 0, 1); | |
2083 } else | |
2084 #endif | |
2085 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0); | |
2086 else MPV_decode_mb_internal(s, block, 0, 0); | |
2256 | 2087 } |
2088 | |
1098
b7f267d168b7
mpeg2 field pictures + sliced mode (doesnt work with mplayer though, dunno why)
michaelni
parents:
1096
diff
changeset
|
2089 /** |
b7f267d168b7
mpeg2 field pictures + sliced mode (doesnt work with mplayer though, dunno why)
michaelni
parents:
1096
diff
changeset
|
2090 * |
b7f267d168b7
mpeg2 field pictures + sliced mode (doesnt work with mplayer though, dunno why)
michaelni
parents:
1096
diff
changeset
|
2091 * @param h is the normal height, this will be reduced automatically if needed for the last row |
b7f267d168b7
mpeg2 field pictures + sliced mode (doesnt work with mplayer though, dunno why)
michaelni
parents:
1096
diff
changeset
|
2092 */ |
b7f267d168b7
mpeg2 field pictures + sliced mode (doesnt work with mplayer though, dunno why)
michaelni
parents:
1096
diff
changeset
|
2093 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){ |
1368 | 2094 if (s->avctx->draw_horiz_band) { |
1370 | 2095 AVFrame *src; |
10604 | 2096 const int field_pic= s->picture_structure != PICT_FRAME; |
1368 | 2097 int offset[4]; |
2967 | 2098 |
10604 | 2099 h= FFMIN(h, (s->avctx->height>>field_pic) - y); |
2100 | |
2101 if(field_pic && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)){ | |
1370 | 2102 h <<= 1; |
2103 y <<= 1; | |
10604 | 2104 if(s->first_field) return; |
1370 | 2105 } |
2106 | |
6481 | 2107 if(s->pict_type==FF_B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER)) |
1370 | 2108 src= (AVFrame*)s->current_picture_ptr; |
2109 else if(s->last_picture_ptr) | |
2110 src= (AVFrame*)s->last_picture_ptr; | |
2111 else | |
2112 return; | |
2967 | 2113 |
6481 | 2114 if(s->pict_type==FF_B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){ |
1368 | 2115 offset[0]= |
2116 offset[1]= | |
2117 offset[2]= | |
2118 offset[3]= 0; | |
2119 }else{ | |
6377 | 2120 offset[0]= y * s->linesize; |
2967 | 2121 offset[1]= |
2074
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2122 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize; |
1368 | 2123 offset[3]= 0; |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
731
diff
changeset
|
2124 } |
1368 | 2125 |
813 | 2126 emms_c(); |
2127 | |
1370 | 2128 s->avctx->draw_horiz_band(s->avctx, src, offset, |
2129 y, s->picture_structure, h); | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
731
diff
changeset
|
2130 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
731
diff
changeset
|
2131 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
731
diff
changeset
|
2132 |
1389 | 2133 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename |
2764 | 2134 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics |
1389 | 2135 const int uvlinesize= s->current_picture.linesize[1]; |
2256 | 2136 const int mb_size= 4 - s->avctx->lowres; |
2967 | 2137 |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
2138 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2; |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
2139 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2; |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
2140 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2; |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
2141 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2; |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
2142 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1; |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1918
diff
changeset
|
2143 s->block_index[5]= s->mb_stride*(s->mb_y + s->mb_height + 2) + s->b8_stride*s->mb_height*2 + s->mb_x - 1; |
2074
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2144 //block_index is not used by mpeg2, so it is not affected by chroma_format |
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2145 |
2256 | 2146 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size); |
2147 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift)); | |
2148 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift)); | |
2168 | 2149 |
6481 | 2150 if(!(s->pict_type==FF_B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME)) |
2074
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2151 { |
10604 | 2152 if(s->picture_structure==PICT_FRAME){ |
2256 | 2153 s->dest[0] += s->mb_y * linesize << mb_size; |
2154 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift); | |
2155 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift); | |
10604 | 2156 }else{ |
2157 s->dest[0] += (s->mb_y>>1) * linesize << mb_size; | |
2158 s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift); | |
2159 s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift); | |
2160 assert((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD)); | |
2161 } | |
2074
2faafe7a3db6
mpeg2 chroma422/444 support, may be slower, may be faster for other codecs
iive
parents:
2066
diff
changeset
|
2162 } |
1389 | 2163 } |
2164 | |
1368 | 2165 void ff_mpeg_flush(AVCodecContext *avctx){ |
2166 int i; | |
2167 MpegEncContext *s = avctx->priv_data; | |
2967 | 2168 |
2169 if(s==NULL || s->picture==NULL) | |
1751 | 2170 return; |
2967 | 2171 |
1368 | 2172 for(i=0; i<MAX_PICTURE_COUNT; i++){ |
2173 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL | |
2174 || s->picture[i].type == FF_BUFFER_TYPE_USER)) | |
9124 | 2175 free_frame_buffer(s, &s->picture[i]); |
1368 | 2176 } |
1601 | 2177 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL; |
2967 | 2178 |
2380 | 2179 s->mb_x= s->mb_y= 0; |
9644
15660ad4c641
decode mpeg-2 closed gop first b frames, fix issue #824
bcoudurier
parents:
9643
diff
changeset
|
2180 s->closed_gop= 0; |
2967 | 2181 |
1395 | 2182 s->parse_context.state= -1; |
2183 s->parse_context.frame_start_found= 0; | |
2184 s->parse_context.overread= 0; | |
2185 s->parse_context.overread_index= 0; | |
2186 s->parse_context.index= 0; | |
2187 s->parse_context.last_index= 0; | |
1851 | 2188 s->bitstream_buffer_size=0; |
4346 | 2189 s->pp_time=0; |
1368 | 2190 } |
2191 | |
2967 | 2192 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s, |
13
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2193 DCTELEM *block, int n, int qscale) |
0 | 2194 { |
200 | 2195 int i, level, nCoeffs; |
1064 | 2196 const uint16_t *quant_matrix; |
0 | 2197 |
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
704
diff
changeset
|
2198 nCoeffs= s->block_last_index[n]; |
2967 | 2199 |
2200 if (n < 4) | |
1689 | 2201 block[0] = block[0] * s->y_dc_scale; |
2202 else | |
2203 block[0] = block[0] * s->c_dc_scale; | |
2204 /* XXX: only mpeg1 */ | |
2205 quant_matrix = s->intra_matrix; | |
2206 for(i=1;i<=nCoeffs;i++) { | |
2207 int j= s->intra_scantable.permutated[i]; | |
2208 level = block[j]; | |
2209 if (level) { | |
2210 if (level < 0) { | |
2211 level = -level; | |
2212 level = (int)(level * qscale * quant_matrix[j]) >> 3; | |
2213 level = (level - 1) | 1; | |
2214 level = -level; | |
2215 } else { | |
2216 level = (int)(level * qscale * quant_matrix[j]) >> 3; | |
2217 level = (level - 1) | 1; | |
0 | 2218 } |
1689 | 2219 block[j] = level; |
0 | 2220 } |
2221 } | |
2222 } | |
13
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2223 |
2967 | 2224 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s, |
1689 | 2225 DCTELEM *block, int n, int qscale) |
2226 { | |
2227 int i, level, nCoeffs; | |
2228 const uint16_t *quant_matrix; | |
2229 | |
2230 nCoeffs= s->block_last_index[n]; | |
2967 | 2231 |
1689 | 2232 quant_matrix = s->inter_matrix; |
2233 for(i=0; i<=nCoeffs; i++) { | |
2234 int j= s->intra_scantable.permutated[i]; | |
2235 level = block[j]; | |
2236 if (level) { | |
2237 if (level < 0) { | |
2238 level = -level; | |
2239 level = (((level << 1) + 1) * qscale * | |
2240 ((int) (quant_matrix[j]))) >> 4; | |
2241 level = (level - 1) | 1; | |
2242 level = -level; | |
2243 } else { | |
2244 level = (((level << 1) + 1) * qscale * | |
2245 ((int) (quant_matrix[j]))) >> 4; | |
2246 level = (level - 1) | 1; | |
2247 } | |
2248 block[j] = level; | |
2249 } | |
2250 } | |
2251 } | |
2252 | |
2967 | 2253 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s, |
325 | 2254 DCTELEM *block, int n, int qscale) |
2255 { | |
2256 int i, level, nCoeffs; | |
1064 | 2257 const uint16_t *quant_matrix; |
325 | 2258 |
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
704
diff
changeset
|
2259 if(s->alternate_scan) nCoeffs= 63; |
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
704
diff
changeset
|
2260 else nCoeffs= s->block_last_index[n]; |
2967 | 2261 |
2262 if (n < 4) | |
1689 | 2263 block[0] = block[0] * s->y_dc_scale; |
2264 else | |
2265 block[0] = block[0] * s->c_dc_scale; | |
2266 quant_matrix = s->intra_matrix; | |
2267 for(i=1;i<=nCoeffs;i++) { | |
2268 int j= s->intra_scantable.permutated[i]; | |
2269 level = block[j]; | |
2270 if (level) { | |
2271 if (level < 0) { | |
2272 level = -level; | |
2273 level = (int)(level * qscale * quant_matrix[j]) >> 3; | |
2274 level = -level; | |
2275 } else { | |
2276 level = (int)(level * qscale * quant_matrix[j]) >> 3; | |
2277 } | |
2278 block[j] = level; | |
2279 } | |
2280 } | |
2281 } | |
2282 | |
3281
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2283 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s, |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2284 DCTELEM *block, int n, int qscale) |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2285 { |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2286 int i, level, nCoeffs; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2287 const uint16_t *quant_matrix; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2288 int sum=-1; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2289 |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2290 if(s->alternate_scan) nCoeffs= 63; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2291 else nCoeffs= s->block_last_index[n]; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2292 |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2293 if (n < 4) |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2294 block[0] = block[0] * s->y_dc_scale; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2295 else |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2296 block[0] = block[0] * s->c_dc_scale; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2297 quant_matrix = s->intra_matrix; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2298 for(i=1;i<=nCoeffs;i++) { |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2299 int j= s->intra_scantable.permutated[i]; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2300 level = block[j]; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2301 if (level) { |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2302 if (level < 0) { |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2303 level = -level; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2304 level = (int)(level * qscale * quant_matrix[j]) >> 3; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2305 level = -level; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2306 } else { |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2307 level = (int)(level * qscale * quant_matrix[j]) >> 3; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2308 } |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2309 block[j] = level; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2310 sum+=level; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2311 } |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2312 } |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2313 block[63]^=sum&1; |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2314 } |
7fac25904a8b
missmatch control for mpeg2 intra dequantization if bitexact=1
michael
parents:
3268
diff
changeset
|
2315 |
2967 | 2316 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s, |
1689 | 2317 DCTELEM *block, int n, int qscale) |
2318 { | |
2319 int i, level, nCoeffs; | |
2320 const uint16_t *quant_matrix; | |
2321 int sum=-1; | |
2322 | |
2323 if(s->alternate_scan) nCoeffs= 63; | |
2324 else nCoeffs= s->block_last_index[n]; | |
2967 | 2325 |
1689 | 2326 quant_matrix = s->inter_matrix; |
2327 for(i=0; i<=nCoeffs; i++) { | |
2328 int j= s->intra_scantable.permutated[i]; | |
2329 level = block[j]; | |
2330 if (level) { | |
2331 if (level < 0) { | |
2332 level = -level; | |
2333 level = (((level << 1) + 1) * qscale * | |
2334 ((int) (quant_matrix[j]))) >> 4; | |
2335 level = -level; | |
2336 } else { | |
2337 level = (((level << 1) + 1) * qscale * | |
2338 ((int) (quant_matrix[j]))) >> 4; | |
2339 } | |
2340 block[j] = level; | |
2341 sum+=level; | |
2342 } | |
2343 } | |
2344 block[63]^=sum&1; | |
2345 } | |
2346 | |
2967 | 2347 static void dct_unquantize_h263_intra_c(MpegEncContext *s, |
1689 | 2348 DCTELEM *block, int n, int qscale) |
2349 { | |
2350 int i, level, qmul, qadd; | |
2351 int nCoeffs; | |
2967 | 2352 |
1689 | 2353 assert(s->block_last_index[n]>=0); |
2967 | 2354 |
1689 | 2355 qmul = qscale << 1; |
2967 | 2356 |
1689 | 2357 if (!s->h263_aic) { |
2967 | 2358 if (n < 4) |
325 | 2359 block[0] = block[0] * s->y_dc_scale; |
2360 else | |
2361 block[0] = block[0] * s->c_dc_scale; | |
1689 | 2362 qadd = (qscale - 1) | 1; |
2363 }else{ | |
2364 qadd = 0; | |
2365 } | |
2366 if(s->ac_pred) | |
2367 nCoeffs=63; | |
2368 else | |
2369 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ]; | |
2370 | |
2371 for(i=1; i<=nCoeffs; i++) { | |
2372 level = block[i]; | |
2373 if (level) { | |
2374 if (level < 0) { | |
2375 level = level * qmul - qadd; | |
2376 } else { | |
2377 level = level * qmul + qadd; | |
325 | 2378 } |
1689 | 2379 block[i] = level; |
325 | 2380 } |
2381 } | |
2382 } | |
2383 | |
2967 | 2384 static void dct_unquantize_h263_inter_c(MpegEncContext *s, |
13
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2385 DCTELEM *block, int n, int qscale) |
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2386 { |
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2387 int i, level, qmul, qadd; |
200 | 2388 int nCoeffs; |
2967 | 2389 |
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
704
diff
changeset
|
2390 assert(s->block_last_index[n]>=0); |
2967 | 2391 |
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
704
diff
changeset
|
2392 qadd = (qscale - 1) | 1; |
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
704
diff
changeset
|
2393 qmul = qscale << 1; |
2967 | 2394 |
1689 | 2395 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ]; |
2396 | |
2397 for(i=0; i<=nCoeffs; i++) { | |
13
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2398 level = block[i]; |
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2399 if (level) { |
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2400 if (level < 0) { |
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2401 level = level * qmul - qadd; |
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2402 } else { |
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2403 level = level * qmul + qadd; |
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2404 } |
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2405 block[i] = level; |
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2406 } |
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2407 } |
174ef88f619a
use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents:
8
diff
changeset
|
2408 } |
0 | 2409 |
5265 | 2410 /** |
2411 * set qscale and update qscale dependent variables. | |
2412 */ | |
2413 void ff_set_qscale(MpegEncContext * s, int qscale) | |
2414 { | |
2415 if (qscale < 1) | |
2416 qscale = 1; | |
2417 else if (qscale > 31) | |
2418 qscale = 31; | |
2419 | |
2420 s->qscale = qscale; | |
2421 s->chroma_qscale= s->chroma_qscale_table[qscale]; | |
2422 | |
2423 s->y_dc_scale= s->y_dc_scale_table[ qscale ]; | |
2424 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ]; | |
2425 } |