2 * H.26L/H.264/AVC/JVT/14496-10/... decoder
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * H.264 / AVC / MPEG4 part10 codec.
25 * @author Michael Niedermayer <michaelni@gmx.at>
28 #include "libavutil/avassert.h"
29 #include "libavutil/imgutils.h"
30 #include "libavutil/timer.h"
33 #include "cabac_functions.h"
34 #include "error_resilience.h"
38 #include "h264chroma.h"
39 #include "h264_mvpred.h"
42 #include "mpegutils.h"
43 #include "rectangle.h"
45 #include "vdpau_internal.h"
47 void ff_h264_unref_picture(H264Context
*h
, H264Picture
*pic
)
49 int off
= offsetof(H264Picture
, tf
) + sizeof(pic
->tf
);
55 ff_thread_release_buffer(h
->avctx
, &pic
->tf
);
56 av_buffer_unref(&pic
->hwaccel_priv_buf
);
58 av_buffer_unref(&pic
->qscale_table_buf
);
59 av_buffer_unref(&pic
->mb_type_buf
);
60 for (i
= 0; i
< 2; i
++) {
61 av_buffer_unref(&pic
->motion_val_buf
[i
]);
62 av_buffer_unref(&pic
->ref_index_buf
[i
]);
65 memset((uint8_t*)pic
+ off
, 0, sizeof(*pic
) - off
);
68 int ff_h264_ref_picture(H264Context
*h
, H264Picture
*dst
, H264Picture
*src
)
72 av_assert0(!dst
->f
.buf
[0]);
73 av_assert0(src
->f
.buf
[0]);
77 ret
= ff_thread_ref_frame(&dst
->tf
, &src
->tf
);
81 dst
->qscale_table_buf
= av_buffer_ref(src
->qscale_table_buf
);
82 dst
->mb_type_buf
= av_buffer_ref(src
->mb_type_buf
);
83 if (!dst
->qscale_table_buf
|| !dst
->mb_type_buf
)
85 dst
->qscale_table
= src
->qscale_table
;
86 dst
->mb_type
= src
->mb_type
;
88 for (i
= 0; i
< 2; i
++) {
89 dst
->motion_val_buf
[i
] = av_buffer_ref(src
->motion_val_buf
[i
]);
90 dst
->ref_index_buf
[i
] = av_buffer_ref(src
->ref_index_buf
[i
]);
91 if (!dst
->motion_val_buf
[i
] || !dst
->ref_index_buf
[i
])
93 dst
->motion_val
[i
] = src
->motion_val
[i
];
94 dst
->ref_index
[i
] = src
->ref_index
[i
];
97 if (src
->hwaccel_picture_private
) {
98 dst
->hwaccel_priv_buf
= av_buffer_ref(src
->hwaccel_priv_buf
);
99 if (!dst
->hwaccel_priv_buf
)
101 dst
->hwaccel_picture_private
= dst
->hwaccel_priv_buf
->data
;
104 for (i
= 0; i
< 2; i
++)
105 dst
->field_poc
[i
] = src
->field_poc
[i
];
107 memcpy(dst
->ref_poc
, src
->ref_poc
, sizeof(src
->ref_poc
));
108 memcpy(dst
->ref_count
, src
->ref_count
, sizeof(src
->ref_count
));
111 dst
->frame_num
= src
->frame_num
;
112 dst
->mmco_reset
= src
->mmco_reset
;
113 dst
->pic_id
= src
->pic_id
;
114 dst
->long_ref
= src
->long_ref
;
115 dst
->mbaff
= src
->mbaff
;
116 dst
->field_picture
= src
->field_picture
;
117 dst
->needs_realloc
= src
->needs_realloc
;
118 dst
->reference
= src
->reference
;
119 dst
->crop
= src
->crop
;
120 dst
->crop_left
= src
->crop_left
;
121 dst
->crop_top
= src
->crop_top
;
122 dst
->recovered
= src
->recovered
;
123 dst
->invalid_gap
= src
->invalid_gap
;
124 dst
->sei_recovery_frame_cnt
= src
->sei_recovery_frame_cnt
;
128 ff_h264_unref_picture(h
, dst
);
132 void ff_h264_set_erpic(ERPicture
*dst
, H264Picture
*src
)
134 #if CONFIG_ERROR_RESILIENCE
137 memset(dst
, 0, sizeof(*dst
));
145 for (i
= 0; i
< 2; i
++) {
146 dst
->motion_val
[i
] = src
->motion_val
[i
];
147 dst
->ref_index
[i
] = src
->ref_index
[i
];
150 dst
->mb_type
= src
->mb_type
;
151 dst
->field_picture
= src
->field_picture
;
152 #endif /* CONFIG_ERROR_RESILIENCE */
155 int ff_h264_field_end(H264Context
*h
, int in_setup
)
157 AVCodecContext
*const avctx
= h
->avctx
;
161 if (CONFIG_H264_VDPAU_DECODER
&&
162 h
->avctx
->codec
->capabilities
& CODEC_CAP_HWACCEL_VDPAU
)
163 ff_vdpau_h264_set_reference_frames(h
);
165 if (in_setup
|| !(avctx
->active_thread_type
& FF_THREAD_FRAME
)) {
167 err
= ff_h264_execute_ref_pic_marking(h
, h
->mmco
, h
->mmco_index
);
168 h
->prev_poc_msb
= h
->poc_msb
;
169 h
->prev_poc_lsb
= h
->poc_lsb
;
171 h
->prev_frame_num_offset
= h
->frame_num_offset
;
172 h
->prev_frame_num
= h
->frame_num
;
173 h
->outputed_poc
= h
->next_outputed_poc
;
176 if (avctx
->hwaccel
) {
177 if (avctx
->hwaccel
->end_frame(avctx
) < 0)
178 av_log(avctx
, AV_LOG_ERROR
,
179 "hardware accelerator failed to decode picture\n");
182 if (CONFIG_H264_VDPAU_DECODER
&&
183 h
->avctx
->codec
->capabilities
& CODEC_CAP_HWACCEL_VDPAU
)
184 ff_vdpau_h264_picture_complete(h
);
186 #if CONFIG_ERROR_RESILIENCE
188 * FIXME: Error handling code does not seem to support interlaced
189 * when slices span multiple rows
190 * The ff_er_add_slice calls don't work right for bottom
191 * fields; they cause massive erroneous error concealing
192 * Error marking covers both fields (top and bottom).
193 * This causes a mismatched s->error_count
194 * and a bad error table. Further, the error count goes to
195 * INT_MAX when called for bottom field, because mb_y is
196 * past end by one (callers fault) and resync_mb_y != 0
197 * causes problems for the first MB line, too.
199 if (!FIELD_PICTURE(h
) && h
->current_slice
&& !h
->sps
.new) {
200 ff_h264_set_erpic(&h
->er
.cur_pic
, h
->cur_pic_ptr
);
201 ff_er_frame_end(&h
->er
);
203 #endif /* CONFIG_ERROR_RESILIENCE */
205 if (!in_setup
&& !h
->droppable
)
206 ff_thread_report_progress(&h
->cur_pic_ptr
->tf
, INT_MAX
,
207 h
->picture_structure
== PICT_BOTTOM_FIELD
);
210 h
->current_slice
= 0;