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