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 / MPEG-4 part10 codec.
25 * @author Michael Niedermayer <michaelni@gmx.at>
28 #include "libavutil/avassert.h"
29 #include "libavutil/emms.h"
30 #include "error_resilience.h"
33 #include "hwaccel_internal.h"
34 #include "mpegutils.h"
35 #include "libavutil/refstruct.h"
37 #include "threadframe.h"
39 void ff_h264_unref_picture(H264Picture
*pic
)
41 int off
= offsetof(H264Picture
, f_grain
) + sizeof(pic
->f_grain
);
44 if (!pic
->f
|| !pic
->f
->buf
[0])
47 ff_thread_release_ext_buffer(&pic
->tf
);
48 av_frame_unref(pic
->f_grain
);
49 av_refstruct_unref(&pic
->hwaccel_picture_private
);
51 av_refstruct_unref(&pic
->qscale_table_base
);
52 av_refstruct_unref(&pic
->mb_type_base
);
53 av_refstruct_unref(&pic
->pps
);
54 for (i
= 0; i
< 2; i
++) {
55 av_refstruct_unref(&pic
->motion_val_base
[i
]);
56 av_refstruct_unref(&pic
->ref_index
[i
]);
58 av_refstruct_unref(&pic
->decode_error_flags
);
60 memset((uint8_t*)pic
+ off
, 0, sizeof(*pic
) - off
);
63 static void h264_copy_picture_params(H264Picture
*dst
, const H264Picture
*src
)
65 av_refstruct_replace(&dst
->qscale_table_base
, src
->qscale_table_base
);
66 av_refstruct_replace(&dst
->mb_type_base
, src
->mb_type_base
);
67 av_refstruct_replace(&dst
->pps
, src
->pps
);
69 for (int i
= 0; i
< 2; i
++) {
70 av_refstruct_replace(&dst
->motion_val_base
[i
], src
->motion_val_base
[i
]);
71 av_refstruct_replace(&dst
->ref_index
[i
], src
->ref_index
[i
]);
74 av_refstruct_replace(&dst
->hwaccel_picture_private
,
75 src
->hwaccel_picture_private
);
77 av_refstruct_replace(&dst
->decode_error_flags
, src
->decode_error_flags
);
79 dst
->qscale_table
= src
->qscale_table
;
80 dst
->mb_type
= src
->mb_type
;
82 for (int i
= 0; i
< 2; i
++)
83 dst
->motion_val
[i
] = src
->motion_val
[i
];
85 for (int i
= 0; i
< 2; i
++)
86 dst
->field_poc
[i
] = src
->field_poc
[i
];
88 memcpy(dst
->ref_poc
, src
->ref_poc
, sizeof(src
->ref_poc
));
89 memcpy(dst
->ref_count
, src
->ref_count
, sizeof(src
->ref_count
));
92 dst
->frame_num
= src
->frame_num
;
93 dst
->mmco_reset
= src
->mmco_reset
;
94 dst
->long_ref
= src
->long_ref
;
95 dst
->mbaff
= src
->mbaff
;
96 dst
->field_picture
= src
->field_picture
;
97 dst
->reference
= src
->reference
;
98 dst
->recovered
= src
->recovered
;
99 dst
->gray
= src
->gray
;
100 dst
->invalid_gap
= src
->invalid_gap
;
101 dst
->sei_recovery_frame_cnt
= src
->sei_recovery_frame_cnt
;
102 dst
->mb_width
= src
->mb_width
;
103 dst
->mb_height
= src
->mb_height
;
104 dst
->mb_stride
= src
->mb_stride
;
105 dst
->needs_fg
= src
->needs_fg
;
108 int ff_h264_ref_picture(H264Picture
*dst
, const H264Picture
*src
)
112 av_assert0(!dst
->f
->buf
[0]);
113 av_assert0(src
->f
->buf
[0]);
114 av_assert0(src
->tf
.f
== src
->f
);
117 ret
= ff_thread_ref_frame(&dst
->tf
, &src
->tf
);
122 ret
= av_frame_ref(dst
->f_grain
, src
->f_grain
);
127 h264_copy_picture_params(dst
, src
);
131 ff_h264_unref_picture(dst
);
135 int ff_h264_replace_picture(H264Picture
*dst
, const H264Picture
*src
)
139 if (!src
->f
|| !src
->f
->buf
[0]) {
140 ff_h264_unref_picture(dst
);
144 av_assert0(src
->tf
.f
== src
->f
);
147 ret
= ff_thread_replace_frame(&dst
->tf
, &src
->tf
);
152 av_frame_unref(dst
->f_grain
);
153 ret
= av_frame_ref(dst
->f_grain
, src
->f_grain
);
158 h264_copy_picture_params(dst
, src
);
162 ff_h264_unref_picture(dst
);
166 void ff_h264_set_erpic(ERPicture
*dst
, const H264Picture
*src
)
168 #if CONFIG_ERROR_RESILIENCE
171 memset(dst
, 0, sizeof(*dst
));
179 for (i
= 0; i
< 2; i
++) {
180 dst
->motion_val
[i
] = src
->motion_val
[i
];
181 dst
->ref_index
[i
] = src
->ref_index
[i
];
184 dst
->mb_type
= src
->mb_type
;
185 dst
->field_picture
= src
->field_picture
;
186 #endif /* CONFIG_ERROR_RESILIENCE */
189 int ff_h264_field_end(H264Context
*h
, H264SliceContext
*sl
, int in_setup
)
191 AVCodecContext
*const avctx
= h
->avctx
;
192 H264Picture
*cur
= h
->cur_pic_ptr
;
196 if (in_setup
|| !(avctx
->active_thread_type
& FF_THREAD_FRAME
)) {
198 err
= ff_h264_execute_ref_pic_marking(h
);
199 h
->poc
.prev_poc_msb
= h
->poc
.poc_msb
;
200 h
->poc
.prev_poc_lsb
= h
->poc
.poc_lsb
;
202 h
->poc
.prev_frame_num_offset
= h
->poc
.frame_num_offset
;
203 h
->poc
.prev_frame_num
= h
->poc
.frame_num
;
206 if (avctx
->hwaccel
) {
207 err
= FF_HW_SIMPLE_CALL(avctx
, end_frame
);
209 av_log(avctx
, AV_LOG_ERROR
,
210 "hardware accelerator failed to decode picture\n");
211 } else if (!in_setup
&& cur
->needs_fg
&& (!FIELD_PICTURE(h
) || !h
->first_field
)) {
212 const AVFrameSideData
*sd
= av_frame_get_side_data(cur
->f
, AV_FRAME_DATA_FILM_GRAIN_PARAMS
);
214 err
= AVERROR_INVALIDDATA
;
215 if (sd
) // a decoding error may have happened before the side data could be allocated
216 err
= ff_h274_apply_film_grain(cur
->f_grain
, cur
->f
, &h
->h274db
,
217 (AVFilmGrainParams
*) sd
->data
);
219 av_log(h
->avctx
, AV_LOG_WARNING
, "Failed synthesizing film "
220 "grain, ignoring: %s\n", av_err2str(err
));
226 if (!in_setup
&& !h
->droppable
)
227 ff_thread_report_progress(&cur
->tf
, INT_MAX
,
228 h
->picture_structure
== PICT_BOTTOM_FIELD
);
231 h
->current_slice
= 0;