Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/frontends/omx/vid_dec_h264_common.c
4561 views
1
/**************************************************************************
2
*
3
* Copyright 2013 Advanced Micro Devices, Inc.
4
* All Rights Reserved.
5
*
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the
8
* "Software"), to deal in the Software without restriction, including
9
* without limitation the rights to use, copy, modify, merge, publish,
10
* distribute, sub license, and/or sell copies of the Software, and to
11
* permit persons to whom the Software is furnished to do so, subject to
12
* the following conditions:
13
*
14
* The above copyright notice and this permission notice (including the
15
* next paragraph) shall be included in all copies or substantial portions
16
* of the Software.
17
*
18
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21
* IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
22
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
*
26
**************************************************************************/
27
28
#if ENABLE_ST_OMX_TIZONIA
29
#include <tizkernel.h>
30
#endif
31
32
#include "util/u_memory.h"
33
34
#include "vid_dec_h264_common.h"
35
36
static void vid_dec_h264_BeginFrame(vid_dec_PrivateType *priv)
37
{
38
//TODO: sane buffer handling
39
40
if (priv->frame_started)
41
return;
42
43
if (!priv->codec) {
44
struct pipe_video_codec templat = {};
45
templat.profile = priv->profile;
46
templat.entrypoint = PIPE_VIDEO_ENTRYPOINT_BITSTREAM;
47
templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;
48
templat.max_references = priv->picture.h264.num_ref_frames;
49
templat.expect_chunked_decode = true;
50
#if ENABLE_ST_OMX_BELLAGIO
51
omx_base_video_PortType *port;
52
port = (omx_base_video_PortType *)priv->ports[OMX_BASE_FILTER_INPUTPORT_INDEX];
53
templat.width = port->sPortParam.format.video.nFrameWidth;
54
templat.height = port->sPortParam.format.video.nFrameHeight;
55
#else
56
templat.width = priv->out_port_def_.format.video.nFrameWidth;
57
templat.height = priv->out_port_def_.format.video.nFrameHeight;
58
#endif
59
templat.level = priv->picture.h264.pps->sps->level_idc;
60
61
priv->codec = priv->pipe->create_video_codec(priv->pipe, &templat);
62
}
63
64
vid_dec_NeedTarget(priv);
65
66
if (priv->first_buf_in_frame)
67
priv->timestamp = priv->timestamps[0];
68
priv->first_buf_in_frame = false;
69
70
priv->picture.h264.num_ref_frames = priv->picture.h264.pps->sps->max_num_ref_frames;
71
72
priv->picture.h264.slice_count = 0;
73
priv->codec->begin_frame(priv->codec, priv->target, &priv->picture.base);
74
priv->frame_started = true;
75
}
76
77
struct pipe_video_buffer *vid_dec_h264_Flush(vid_dec_PrivateType *priv,
78
OMX_TICKS *timestamp)
79
{
80
struct dpb_list *entry, *result = NULL;
81
struct pipe_video_buffer *buf;
82
83
/* search for the lowest poc and break on zeros */
84
LIST_FOR_EACH_ENTRY(entry, &priv->codec_data.h264.dpb_list, list) {
85
86
if (result && entry->poc == 0)
87
break;
88
89
if (!result || entry->poc < result->poc)
90
result = entry;
91
}
92
93
if (!result)
94
return NULL;
95
96
buf = result->buffer;
97
if (timestamp)
98
*timestamp = result->timestamp;
99
100
--priv->codec_data.h264.dpb_num;
101
list_del(&result->list);
102
FREE(result);
103
104
return buf;
105
}
106
107
void vid_dec_h264_EndFrame(vid_dec_PrivateType *priv)
108
{
109
struct dpb_list *entry;
110
struct pipe_video_buffer *tmp;
111
bool top_field_first;
112
OMX_TICKS timestamp = 0;
113
114
if (!priv->frame_started)
115
return;
116
117
priv->codec->end_frame(priv->codec, priv->target, &priv->picture.base);
118
priv->frame_started = false;
119
120
// TODO: implement frame number handling
121
priv->picture.h264.frame_num_list[0] = priv->picture.h264.frame_num;
122
priv->picture.h264.field_order_cnt_list[0][0] = priv->picture.h264.frame_num;
123
priv->picture.h264.field_order_cnt_list[0][1] = priv->picture.h264.frame_num;
124
125
top_field_first = priv->picture.h264.field_order_cnt[0] < priv->picture.h264.field_order_cnt[1];
126
127
if (priv->picture.h264.field_pic_flag && priv->picture.h264.bottom_field_flag != top_field_first)
128
return;
129
130
/* add the decoded picture to the dpb list */
131
entry = CALLOC_STRUCT(dpb_list);
132
if (!entry)
133
return;
134
135
priv->first_buf_in_frame = true;
136
entry->buffer = priv->target;
137
entry->timestamp = priv->timestamp;
138
entry->poc = MIN2(priv->picture.h264.field_order_cnt[0], priv->picture.h264.field_order_cnt[1]);
139
list_addtail(&entry->list, &priv->codec_data.h264.dpb_list);
140
++priv->codec_data.h264.dpb_num;
141
priv->target = NULL;
142
priv->picture.h264.field_order_cnt[0] = priv->picture.h264.field_order_cnt[1] = INT_MAX;
143
144
if (priv->codec_data.h264.dpb_num <= DPB_MAX_SIZE)
145
return;
146
147
tmp = priv->in_buffers[0]->pInputPortPrivate;
148
priv->in_buffers[0]->pInputPortPrivate = vid_dec_h264_Flush(priv, &timestamp);
149
priv->in_buffers[0]->nTimeStamp = timestamp;
150
priv->target = tmp;
151
priv->frame_finished = priv->in_buffers[0]->pInputPortPrivate != NULL;
152
}
153
154
static void vui_parameters(struct vl_rbsp *rbsp)
155
{
156
// TODO
157
}
158
159
static void scaling_list(struct vl_rbsp *rbsp, uint8_t *scalingList, unsigned sizeOfScalingList,
160
const uint8_t *defaultList, const uint8_t *fallbackList)
161
{
162
unsigned lastScale = 8, nextScale = 8;
163
const int *list;
164
unsigned i;
165
166
/* (pic|seq)_scaling_list_present_flag[i] */
167
if (!vl_rbsp_u(rbsp, 1)) {
168
if (fallbackList)
169
memcpy(scalingList, fallbackList, sizeOfScalingList);
170
return;
171
}
172
173
list = (sizeOfScalingList == 16) ? vl_zscan_normal_16 : vl_zscan_normal;
174
for (i = 0; i < sizeOfScalingList; ++i ) {
175
176
if (nextScale != 0) {
177
signed delta_scale = vl_rbsp_se(rbsp);
178
nextScale = (lastScale + delta_scale + 256) % 256;
179
if (i == 0 && nextScale == 0) {
180
memcpy(scalingList, defaultList, sizeOfScalingList);
181
return;
182
}
183
}
184
scalingList[list[i]] = nextScale == 0 ? lastScale : nextScale;
185
lastScale = scalingList[list[i]];
186
}
187
}
188
189
static struct pipe_h264_sps *seq_parameter_set_id(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)
190
{
191
unsigned id = vl_rbsp_ue(rbsp);
192
if (id >= ARRAY_SIZE(priv->codec_data.h264.sps))
193
return NULL; /* invalid seq_parameter_set_id */
194
195
return &priv->codec_data.h264.sps[id];
196
}
197
198
static void seq_parameter_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)
199
{
200
struct pipe_h264_sps *sps;
201
unsigned profile_idc, level_idc;
202
unsigned i;
203
204
/* Sequence parameter set */
205
profile_idc = vl_rbsp_u(rbsp, 8);
206
207
/* constraint_set0_flag */
208
vl_rbsp_u(rbsp, 1);
209
210
/* constraint_set1_flag */
211
vl_rbsp_u(rbsp, 1);
212
213
/* constraint_set2_flag */
214
vl_rbsp_u(rbsp, 1);
215
216
/* constraint_set3_flag */
217
vl_rbsp_u(rbsp, 1);
218
219
/* constraint_set4_flag */
220
vl_rbsp_u(rbsp, 1);
221
222
/* constraint_set5_flag */
223
vl_rbsp_u(rbsp, 1);
224
225
/* reserved_zero_2bits */
226
vl_rbsp_u(rbsp, 2);
227
228
/* level_idc */
229
level_idc = vl_rbsp_u(rbsp, 8);
230
231
sps = seq_parameter_set_id(priv, rbsp);
232
if (!sps)
233
return;
234
235
memset(sps, 0, sizeof(*sps));
236
memset(sps->ScalingList4x4, 16, sizeof(sps->ScalingList4x4));
237
memset(sps->ScalingList8x8, 16, sizeof(sps->ScalingList8x8));
238
239
sps->level_idc = level_idc;
240
241
if (profile_idc == 100 || profile_idc == 110 || profile_idc == 122 || profile_idc == 244 ||
242
profile_idc == 44 || profile_idc == 83 || profile_idc == 86 || profile_idc == 118 ||
243
profile_idc == 128 || profile_idc == 138) {
244
245
sps->chroma_format_idc = vl_rbsp_ue(rbsp);
246
247
if (sps->chroma_format_idc == 3)
248
sps->separate_colour_plane_flag = vl_rbsp_u(rbsp, 1);
249
250
sps->bit_depth_luma_minus8 = vl_rbsp_ue(rbsp);
251
252
sps->bit_depth_chroma_minus8 = vl_rbsp_ue(rbsp);
253
254
/* qpprime_y_zero_transform_bypass_flag */
255
vl_rbsp_u(rbsp, 1);
256
257
sps->seq_scaling_matrix_present_flag = vl_rbsp_u(rbsp, 1);
258
if (sps->seq_scaling_matrix_present_flag) {
259
260
scaling_list(rbsp, sps->ScalingList4x4[0], 16, Default_4x4_Intra, Default_4x4_Intra);
261
scaling_list(rbsp, sps->ScalingList4x4[1], 16, Default_4x4_Intra, sps->ScalingList4x4[0]);
262
scaling_list(rbsp, sps->ScalingList4x4[2], 16, Default_4x4_Intra, sps->ScalingList4x4[1]);
263
scaling_list(rbsp, sps->ScalingList4x4[3], 16, Default_4x4_Inter, Default_4x4_Inter);
264
scaling_list(rbsp, sps->ScalingList4x4[4], 16, Default_4x4_Inter, sps->ScalingList4x4[3]);
265
scaling_list(rbsp, sps->ScalingList4x4[5], 16, Default_4x4_Inter, sps->ScalingList4x4[4]);
266
267
scaling_list(rbsp, sps->ScalingList8x8[0], 64, Default_8x8_Intra, Default_8x8_Intra);
268
scaling_list(rbsp, sps->ScalingList8x8[1], 64, Default_8x8_Inter, Default_8x8_Inter);
269
if (sps->chroma_format_idc == 3) {
270
scaling_list(rbsp, sps->ScalingList8x8[2], 64, Default_8x8_Intra, sps->ScalingList8x8[0]);
271
scaling_list(rbsp, sps->ScalingList8x8[3], 64, Default_8x8_Inter, sps->ScalingList8x8[1]);
272
scaling_list(rbsp, sps->ScalingList8x8[4], 64, Default_8x8_Intra, sps->ScalingList8x8[2]);
273
scaling_list(rbsp, sps->ScalingList8x8[5], 64, Default_8x8_Inter, sps->ScalingList8x8[3]);
274
}
275
}
276
} else if (profile_idc == 183)
277
sps->chroma_format_idc = 0;
278
else
279
sps->chroma_format_idc = 1;
280
281
sps->log2_max_frame_num_minus4 = vl_rbsp_ue(rbsp);
282
283
sps->pic_order_cnt_type = vl_rbsp_ue(rbsp);
284
285
if (sps->pic_order_cnt_type == 0)
286
sps->log2_max_pic_order_cnt_lsb_minus4 = vl_rbsp_ue(rbsp);
287
else if (sps->pic_order_cnt_type == 1) {
288
sps->delta_pic_order_always_zero_flag = vl_rbsp_u(rbsp, 1);
289
290
sps->offset_for_non_ref_pic = vl_rbsp_se(rbsp);
291
292
sps->offset_for_top_to_bottom_field = vl_rbsp_se(rbsp);
293
294
sps->num_ref_frames_in_pic_order_cnt_cycle = vl_rbsp_ue(rbsp);
295
296
for (i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; ++i)
297
sps->offset_for_ref_frame[i] = vl_rbsp_se(rbsp);
298
}
299
300
sps->max_num_ref_frames = vl_rbsp_ue(rbsp);
301
302
/* gaps_in_frame_num_value_allowed_flag */
303
vl_rbsp_u(rbsp, 1);
304
305
/* pic_width_in_mbs_minus1 */
306
ASSERTED int pic_width_in_samplesl = (vl_rbsp_ue(rbsp) + 1) * 16;
307
assert(pic_width_in_samplesl);
308
309
/* pic_height_in_map_units_minus1 */
310
ASSERTED int pic_height_in_map_units = vl_rbsp_ue(rbsp) + 1;
311
assert(pic_height_in_map_units);
312
313
sps->frame_mbs_only_flag = vl_rbsp_u(rbsp, 1);
314
if (!sps->frame_mbs_only_flag)
315
sps->mb_adaptive_frame_field_flag = vl_rbsp_u(rbsp, 1);
316
317
sps->direct_8x8_inference_flag = vl_rbsp_u(rbsp, 1);
318
319
#if ENABLE_ST_OMX_TIZONIA
320
priv->stream_info.width = pic_width_in_samplesl;
321
322
int frame_height_in_mbs = (2 - sps->frame_mbs_only_flag) * pic_height_in_map_units;
323
int pic_height_in_mbs = frame_height_in_mbs / ( 1 + priv->picture.h264.field_pic_flag );
324
int pic_height_in_samplesl = pic_height_in_mbs * 16;
325
priv->stream_info.height = pic_height_in_samplesl;
326
327
328
/* frame_cropping_flag */
329
if (vl_rbsp_u(rbsp, 1)) {
330
unsigned frame_crop_left_offset = vl_rbsp_ue(rbsp);
331
unsigned frame_crop_right_offset = vl_rbsp_ue(rbsp);
332
unsigned frame_crop_top_offset = vl_rbsp_ue(rbsp);
333
unsigned frame_crop_bottom_offset = vl_rbsp_ue(rbsp);
334
335
priv->stream_info.width -= (frame_crop_left_offset + frame_crop_right_offset) * 2;
336
priv->stream_info.height -= (frame_crop_top_offset + frame_crop_bottom_offset) * 2;
337
}
338
#else
339
/* frame_cropping_flag */
340
if (vl_rbsp_u(rbsp, 1)) {
341
/* frame_crop_left_offset */
342
vl_rbsp_ue(rbsp);
343
344
/* frame_crop_right_offset */
345
vl_rbsp_ue(rbsp);
346
347
/* frame_crop_top_offset */
348
vl_rbsp_ue(rbsp);
349
350
/* frame_crop_bottom_offset */
351
vl_rbsp_ue(rbsp);
352
}
353
#endif
354
355
/* vui_parameters_present_flag */
356
if (vl_rbsp_u(rbsp, 1))
357
vui_parameters(rbsp);
358
}
359
360
static struct pipe_h264_pps *pic_parameter_set_id(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)
361
{
362
unsigned id = vl_rbsp_ue(rbsp);
363
if (id >= ARRAY_SIZE(priv->codec_data.h264.pps))
364
return NULL; /* invalid pic_parameter_set_id */
365
366
return &priv->codec_data.h264.pps[id];
367
}
368
369
static void picture_parameter_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)
370
{
371
struct pipe_h264_sps *sps;
372
struct pipe_h264_pps *pps;
373
unsigned i;
374
375
pps = pic_parameter_set_id(priv, rbsp);
376
if (!pps)
377
return;
378
379
memset(pps, 0, sizeof(*pps));
380
381
sps = pps->sps = seq_parameter_set_id(priv, rbsp);
382
if (!sps)
383
return;
384
385
memcpy(pps->ScalingList4x4, sps->ScalingList4x4, sizeof(pps->ScalingList4x4));
386
memcpy(pps->ScalingList8x8, sps->ScalingList8x8, sizeof(pps->ScalingList8x8));
387
388
pps->entropy_coding_mode_flag = vl_rbsp_u(rbsp, 1);
389
390
pps->bottom_field_pic_order_in_frame_present_flag = vl_rbsp_u(rbsp, 1);
391
392
pps->num_slice_groups_minus1 = vl_rbsp_ue(rbsp);
393
if (pps->num_slice_groups_minus1 > 0) {
394
pps->slice_group_map_type = vl_rbsp_ue(rbsp);
395
396
if (pps->slice_group_map_type == 0) {
397
398
for (i = 0; i <= pps->num_slice_groups_minus1; ++i)
399
/* run_length_minus1[i] */
400
vl_rbsp_ue(rbsp);
401
402
} else if (pps->slice_group_map_type == 2) {
403
404
for (i = 0; i <= pps->num_slice_groups_minus1; ++i) {
405
/* top_left[i] */
406
vl_rbsp_ue(rbsp);
407
408
/* bottom_right[i] */
409
vl_rbsp_ue(rbsp);
410
}
411
412
} else if (pps->slice_group_map_type >= 3 && pps->slice_group_map_type <= 5) {
413
414
/* slice_group_change_direction_flag */
415
vl_rbsp_u(rbsp, 1);
416
417
pps->slice_group_change_rate_minus1 = vl_rbsp_ue(rbsp);
418
419
} else if (pps->slice_group_map_type == 6) {
420
421
unsigned pic_size_in_map_units_minus1;
422
423
pic_size_in_map_units_minus1 = vl_rbsp_ue(rbsp);
424
425
for (i = 0; i <= pic_size_in_map_units_minus1; ++i)
426
/* slice_group_id[i] */
427
vl_rbsp_u(rbsp, log2(pps->num_slice_groups_minus1 + 1));
428
}
429
}
430
431
pps->num_ref_idx_l0_default_active_minus1 = vl_rbsp_ue(rbsp);
432
433
pps->num_ref_idx_l1_default_active_minus1 = vl_rbsp_ue(rbsp);
434
435
pps->weighted_pred_flag = vl_rbsp_u(rbsp, 1);
436
437
pps->weighted_bipred_idc = vl_rbsp_u(rbsp, 2);
438
439
pps->pic_init_qp_minus26 = vl_rbsp_se(rbsp);
440
441
/* pic_init_qs_minus26 */
442
vl_rbsp_se(rbsp);
443
444
pps->chroma_qp_index_offset = vl_rbsp_se(rbsp);
445
446
pps->deblocking_filter_control_present_flag = vl_rbsp_u(rbsp, 1);
447
448
pps->constrained_intra_pred_flag = vl_rbsp_u(rbsp, 1);
449
450
pps->redundant_pic_cnt_present_flag = vl_rbsp_u(rbsp, 1);
451
452
if (vl_rbsp_more_data(rbsp)) {
453
pps->transform_8x8_mode_flag = vl_rbsp_u(rbsp, 1);
454
455
/* pic_scaling_matrix_present_flag */
456
if (vl_rbsp_u(rbsp, 1)) {
457
458
scaling_list(rbsp, pps->ScalingList4x4[0], 16, Default_4x4_Intra,
459
sps->seq_scaling_matrix_present_flag ? NULL : Default_4x4_Intra);
460
scaling_list(rbsp, pps->ScalingList4x4[1], 16, Default_4x4_Intra, pps->ScalingList4x4[0]);
461
scaling_list(rbsp, pps->ScalingList4x4[2], 16, Default_4x4_Intra, pps->ScalingList4x4[1]);
462
scaling_list(rbsp, pps->ScalingList4x4[3], 16, Default_4x4_Inter,
463
sps->seq_scaling_matrix_present_flag ? NULL : Default_4x4_Inter);
464
scaling_list(rbsp, pps->ScalingList4x4[4], 16, Default_4x4_Inter, pps->ScalingList4x4[3]);
465
scaling_list(rbsp, pps->ScalingList4x4[5], 16, Default_4x4_Inter, pps->ScalingList4x4[4]);
466
467
if (pps->transform_8x8_mode_flag) {
468
scaling_list(rbsp, pps->ScalingList8x8[0], 64, Default_8x8_Intra,
469
sps->seq_scaling_matrix_present_flag ? NULL : Default_8x8_Intra);
470
scaling_list(rbsp, pps->ScalingList8x8[1], 64, Default_8x8_Inter,
471
sps->seq_scaling_matrix_present_flag ? NULL : Default_8x8_Inter);
472
if (sps->chroma_format_idc == 3) {
473
scaling_list(rbsp, pps->ScalingList8x8[2], 64, Default_8x8_Intra, pps->ScalingList8x8[0]);
474
scaling_list(rbsp, pps->ScalingList8x8[3], 64, Default_8x8_Inter, pps->ScalingList8x8[1]);
475
scaling_list(rbsp, pps->ScalingList8x8[4], 64, Default_8x8_Intra, pps->ScalingList8x8[2]);
476
scaling_list(rbsp, pps->ScalingList8x8[5], 64, Default_8x8_Inter, pps->ScalingList8x8[3]);
477
}
478
}
479
}
480
481
pps->second_chroma_qp_index_offset = vl_rbsp_se(rbsp);
482
}
483
}
484
485
static void ref_pic_list_mvc_modification(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)
486
{
487
// TODO
488
assert(0);
489
}
490
491
static void ref_pic_list_modification(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,
492
enum pipe_h264_slice_type slice_type)
493
{
494
unsigned modification_of_pic_nums_idc;
495
496
if (slice_type != 2 && slice_type != 4) {
497
/* ref_pic_list_modification_flag_l0 */
498
if (vl_rbsp_u(rbsp, 1)) {
499
do {
500
modification_of_pic_nums_idc = vl_rbsp_ue(rbsp);
501
if (modification_of_pic_nums_idc == 0 ||
502
modification_of_pic_nums_idc == 1)
503
/* abs_diff_pic_num_minus1 */
504
vl_rbsp_ue(rbsp);
505
else if (modification_of_pic_nums_idc == 2)
506
/* long_term_pic_num */
507
vl_rbsp_ue(rbsp);
508
} while (modification_of_pic_nums_idc != 3);
509
}
510
}
511
512
if (slice_type == 1) {
513
/* ref_pic_list_modification_flag_l1 */
514
if (vl_rbsp_u(rbsp, 1)) {
515
do {
516
modification_of_pic_nums_idc = vl_rbsp_ue(rbsp);
517
if (modification_of_pic_nums_idc == 0 ||
518
modification_of_pic_nums_idc == 1)
519
/* abs_diff_pic_num_minus1 */
520
vl_rbsp_ue(rbsp);
521
else if (modification_of_pic_nums_idc == 2)
522
/* long_term_pic_num */
523
vl_rbsp_ue(rbsp);
524
} while (modification_of_pic_nums_idc != 3);
525
}
526
}
527
}
528
529
static void pred_weight_table(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,
530
struct pipe_h264_sps *sps, enum pipe_h264_slice_type slice_type)
531
{
532
unsigned ChromaArrayType = sps->separate_colour_plane_flag ? 0 : sps->chroma_format_idc;
533
unsigned i, j;
534
535
/* luma_log2_weight_denom */
536
vl_rbsp_ue(rbsp);
537
538
if (ChromaArrayType != 0)
539
/* chroma_log2_weight_denom */
540
vl_rbsp_ue(rbsp);
541
542
for (i = 0; i <= priv->picture.h264.num_ref_idx_l0_active_minus1; ++i) {
543
/* luma_weight_l0_flag */
544
if (vl_rbsp_u(rbsp, 1)) {
545
/* luma_weight_l0[i] */
546
vl_rbsp_se(rbsp);
547
/* luma_offset_l0[i] */
548
vl_rbsp_se(rbsp);
549
}
550
if (ChromaArrayType != 0) {
551
/* chroma_weight_l0_flag */
552
if (vl_rbsp_u(rbsp, 1)) {
553
for (j = 0; j < 2; ++j) {
554
/* chroma_weight_l0[i][j] */
555
vl_rbsp_se(rbsp);
556
/* chroma_offset_l0[i][j] */
557
vl_rbsp_se(rbsp);
558
}
559
}
560
}
561
}
562
563
if (slice_type == 1) {
564
for (i = 0; i <= priv->picture.h264.num_ref_idx_l1_active_minus1; ++i) {
565
/* luma_weight_l1_flag */
566
if (vl_rbsp_u(rbsp, 1)) {
567
/* luma_weight_l1[i] */
568
vl_rbsp_se(rbsp);
569
/* luma_offset_l1[i] */
570
vl_rbsp_se(rbsp);
571
}
572
if (ChromaArrayType != 0) {
573
/* chroma_weight_l1_flag */
574
if (vl_rbsp_u(rbsp, 1)) {
575
for (j = 0; j < 2; ++j) {
576
/* chroma_weight_l1[i][j] */
577
vl_rbsp_se(rbsp);
578
/* chroma_offset_l1[i][j] */
579
vl_rbsp_se(rbsp);
580
}
581
}
582
}
583
}
584
}
585
}
586
587
static void dec_ref_pic_marking(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,
588
bool IdrPicFlag)
589
{
590
unsigned memory_management_control_operation;
591
592
if (IdrPicFlag) {
593
/* no_output_of_prior_pics_flag */
594
vl_rbsp_u(rbsp, 1);
595
/* long_term_reference_flag */
596
vl_rbsp_u(rbsp, 1);
597
} else {
598
/* adaptive_ref_pic_marking_mode_flag */
599
if (vl_rbsp_u(rbsp, 1)) {
600
do {
601
memory_management_control_operation = vl_rbsp_ue(rbsp);
602
603
if (memory_management_control_operation == 1 ||
604
memory_management_control_operation == 3)
605
/* difference_of_pic_nums_minus1 */
606
vl_rbsp_ue(rbsp);
607
608
if (memory_management_control_operation == 2)
609
/* long_term_pic_num */
610
vl_rbsp_ue(rbsp);
611
612
if (memory_management_control_operation == 3 ||
613
memory_management_control_operation == 6)
614
/* long_term_frame_idx */
615
vl_rbsp_ue(rbsp);
616
617
if (memory_management_control_operation == 4)
618
/* max_long_term_frame_idx_plus1 */
619
vl_rbsp_ue(rbsp);
620
} while (memory_management_control_operation != 0);
621
}
622
}
623
}
624
625
static void slice_header(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp,
626
unsigned nal_ref_idc, unsigned nal_unit_type)
627
{
628
enum pipe_h264_slice_type slice_type;
629
struct pipe_h264_pps *pps;
630
struct pipe_h264_sps *sps;
631
unsigned frame_num, prevFrameNum;
632
bool IdrPicFlag = nal_unit_type == 5;
633
634
if (IdrPicFlag != priv->codec_data.h264.IdrPicFlag)
635
vid_dec_h264_EndFrame(priv);
636
637
priv->codec_data.h264.IdrPicFlag = IdrPicFlag;
638
639
/* first_mb_in_slice */
640
vl_rbsp_ue(rbsp);
641
642
slice_type = vl_rbsp_ue(rbsp) % 5;
643
644
/* get picture parameter set */
645
pps = pic_parameter_set_id(priv, rbsp);
646
if (!pps)
647
return;
648
649
/* get sequence parameter set */
650
sps = pps->sps;
651
if (!sps)
652
return;
653
654
if (pps != priv->picture.h264.pps)
655
vid_dec_h264_EndFrame(priv);
656
657
priv->picture.h264.pps = pps;
658
659
if (sps->separate_colour_plane_flag == 1 )
660
/* colour_plane_id */
661
vl_rbsp_u(rbsp, 2);
662
663
/* frame number handling */
664
frame_num = vl_rbsp_u(rbsp, sps->log2_max_frame_num_minus4 + 4);
665
666
if (frame_num != priv->picture.h264.frame_num)
667
vid_dec_h264_EndFrame(priv);
668
669
prevFrameNum = priv->picture.h264.frame_num;
670
priv->picture.h264.frame_num = frame_num;
671
672
priv->picture.h264.field_pic_flag = 0;
673
priv->picture.h264.bottom_field_flag = 0;
674
675
if (!sps->frame_mbs_only_flag) {
676
unsigned field_pic_flag = vl_rbsp_u(rbsp, 1);
677
678
if (!field_pic_flag && field_pic_flag != priv->picture.h264.field_pic_flag)
679
vid_dec_h264_EndFrame(priv);
680
681
priv->picture.h264.field_pic_flag = field_pic_flag;
682
683
if (priv->picture.h264.field_pic_flag) {
684
unsigned bottom_field_flag = vl_rbsp_u(rbsp, 1);
685
686
if (bottom_field_flag != priv->picture.h264.bottom_field_flag)
687
vid_dec_h264_EndFrame(priv);
688
689
priv->picture.h264.bottom_field_flag = bottom_field_flag;
690
}
691
}
692
693
if (IdrPicFlag) {
694
/* set idr_pic_id */
695
unsigned idr_pic_id = vl_rbsp_ue(rbsp);
696
697
if (idr_pic_id != priv->codec_data.h264.idr_pic_id)
698
vid_dec_h264_EndFrame(priv);
699
700
priv->codec_data.h264.idr_pic_id = idr_pic_id;
701
}
702
703
if (sps->pic_order_cnt_type == 0) {
704
/* pic_order_cnt_lsb */
705
unsigned log2_max_pic_order_cnt_lsb = sps->log2_max_pic_order_cnt_lsb_minus4 + 4;
706
unsigned max_pic_order_cnt_lsb = 1 << log2_max_pic_order_cnt_lsb;
707
int pic_order_cnt_lsb = vl_rbsp_u(rbsp, log2_max_pic_order_cnt_lsb);
708
int pic_order_cnt_msb;
709
710
if (pic_order_cnt_lsb != priv->codec_data.h264.pic_order_cnt_lsb)
711
vid_dec_h264_EndFrame(priv);
712
713
if (IdrPicFlag) {
714
priv->codec_data.h264.pic_order_cnt_msb = 0;
715
priv->codec_data.h264.pic_order_cnt_lsb = 0;
716
}
717
718
if ((pic_order_cnt_lsb < priv->codec_data.h264.pic_order_cnt_lsb) &&
719
(priv->codec_data.h264.pic_order_cnt_lsb - pic_order_cnt_lsb) >= (max_pic_order_cnt_lsb / 2))
720
pic_order_cnt_msb = priv->codec_data.h264.pic_order_cnt_msb + max_pic_order_cnt_lsb;
721
722
else if ((pic_order_cnt_lsb > priv->codec_data.h264.pic_order_cnt_lsb) &&
723
(pic_order_cnt_lsb - priv->codec_data.h264.pic_order_cnt_lsb) > (max_pic_order_cnt_lsb / 2))
724
pic_order_cnt_msb = priv->codec_data.h264.pic_order_cnt_msb - max_pic_order_cnt_lsb;
725
726
else
727
pic_order_cnt_msb = priv->codec_data.h264.pic_order_cnt_msb;
728
729
priv->codec_data.h264.pic_order_cnt_msb = pic_order_cnt_msb;
730
priv->codec_data.h264.pic_order_cnt_lsb = pic_order_cnt_lsb;
731
732
if (pps->bottom_field_pic_order_in_frame_present_flag && !priv->picture.h264.field_pic_flag) {
733
/* delta_pic_oreder_cnt_bottom */
734
unsigned delta_pic_order_cnt_bottom = vl_rbsp_se(rbsp);
735
736
if (delta_pic_order_cnt_bottom != priv->codec_data.h264.delta_pic_order_cnt_bottom)
737
vid_dec_h264_EndFrame(priv);
738
739
priv->codec_data.h264.delta_pic_order_cnt_bottom = delta_pic_order_cnt_bottom;
740
}
741
742
if (!priv->picture.h264.field_pic_flag) {
743
priv->picture.h264.field_order_cnt[0] = pic_order_cnt_msb + pic_order_cnt_lsb;
744
priv->picture.h264.field_order_cnt[1] = priv->picture.h264.field_order_cnt [0] +
745
priv->codec_data.h264.delta_pic_order_cnt_bottom;
746
} else if (!priv->picture.h264.bottom_field_flag)
747
priv->picture.h264.field_order_cnt[0] = pic_order_cnt_msb + pic_order_cnt_lsb;
748
else
749
priv->picture.h264.field_order_cnt[1] = pic_order_cnt_msb + pic_order_cnt_lsb;
750
751
} else if (sps->pic_order_cnt_type == 1) {
752
/* delta_pic_order_cnt[0] */
753
unsigned MaxFrameNum = 1 << (sps->log2_max_frame_num_minus4 + 4);
754
unsigned FrameNumOffset, absFrameNum, expectedPicOrderCnt;
755
756
if (!sps->delta_pic_order_always_zero_flag) {
757
unsigned delta_pic_order_cnt[2];
758
759
delta_pic_order_cnt[0] = vl_rbsp_se(rbsp);
760
761
if (delta_pic_order_cnt[0] != priv->codec_data.h264.delta_pic_order_cnt[0])
762
vid_dec_h264_EndFrame(priv);
763
764
priv->codec_data.h264.delta_pic_order_cnt[0] = delta_pic_order_cnt[0];
765
766
if (pps->bottom_field_pic_order_in_frame_present_flag && !priv->picture.h264.field_pic_flag) {
767
/* delta_pic_order_cnt[1] */
768
delta_pic_order_cnt[1] = vl_rbsp_se(rbsp);
769
770
if (delta_pic_order_cnt[1] != priv->codec_data.h264.delta_pic_order_cnt[1])
771
vid_dec_h264_EndFrame(priv);
772
773
priv->codec_data.h264.delta_pic_order_cnt[1] = delta_pic_order_cnt[1];
774
}
775
}
776
777
if (IdrPicFlag)
778
FrameNumOffset = 0;
779
else if (prevFrameNum > frame_num)
780
FrameNumOffset = priv->codec_data.h264.prevFrameNumOffset + MaxFrameNum;
781
else
782
FrameNumOffset = priv->codec_data.h264.prevFrameNumOffset;
783
784
priv->codec_data.h264.prevFrameNumOffset = FrameNumOffset;
785
786
if (sps->num_ref_frames_in_pic_order_cnt_cycle != 0)
787
absFrameNum = FrameNumOffset + frame_num;
788
else
789
absFrameNum = 0;
790
791
if (nal_ref_idc == 0 && absFrameNum > 0)
792
absFrameNum = absFrameNum - 1;
793
794
if (absFrameNum > 0) {
795
unsigned picOrderCntCycleCnt = (absFrameNum - 1) / sps->num_ref_frames_in_pic_order_cnt_cycle;
796
unsigned frameNumInPicOrderCntCycle = (absFrameNum - 1) % sps->num_ref_frames_in_pic_order_cnt_cycle;
797
signed ExpectedDeltaPerPicOrderCntCycle = 0;
798
unsigned i;
799
800
for (i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; ++i)
801
ExpectedDeltaPerPicOrderCntCycle += sps->offset_for_ref_frame[i];
802
803
expectedPicOrderCnt = picOrderCntCycleCnt * ExpectedDeltaPerPicOrderCntCycle;
804
for (i = 0; i <= frameNumInPicOrderCntCycle; ++i)
805
expectedPicOrderCnt += sps->offset_for_ref_frame[i];
806
807
} else
808
expectedPicOrderCnt = 0;
809
810
if (nal_ref_idc == 0)
811
expectedPicOrderCnt += sps->offset_for_non_ref_pic;
812
813
if (!priv->picture.h264.field_pic_flag) {
814
priv->picture.h264.field_order_cnt[0] = expectedPicOrderCnt + priv->codec_data.h264.delta_pic_order_cnt[0];
815
priv->picture.h264.field_order_cnt[1] = priv->picture.h264.field_order_cnt[0] +
816
sps->offset_for_top_to_bottom_field + priv->codec_data.h264.delta_pic_order_cnt[1];
817
818
} else if (!priv->picture.h264.bottom_field_flag)
819
priv->picture.h264.field_order_cnt[0] = expectedPicOrderCnt + priv->codec_data.h264.delta_pic_order_cnt[0];
820
else
821
priv->picture.h264.field_order_cnt[1] = expectedPicOrderCnt + sps->offset_for_top_to_bottom_field +
822
priv->codec_data.h264.delta_pic_order_cnt[0];
823
824
} else if (sps->pic_order_cnt_type == 2) {
825
unsigned MaxFrameNum = 1 << (sps->log2_max_frame_num_minus4 + 4);
826
unsigned FrameNumOffset, tempPicOrderCnt;
827
828
if (IdrPicFlag)
829
FrameNumOffset = 0;
830
else if (prevFrameNum > frame_num)
831
FrameNumOffset = priv->codec_data.h264.prevFrameNumOffset + MaxFrameNum;
832
else
833
FrameNumOffset = priv->codec_data.h264.prevFrameNumOffset;
834
835
priv->codec_data.h264.prevFrameNumOffset = FrameNumOffset;
836
837
if (IdrPicFlag)
838
tempPicOrderCnt = 0;
839
else if (nal_ref_idc == 0)
840
tempPicOrderCnt = 2 * (FrameNumOffset + frame_num) - 1;
841
else
842
tempPicOrderCnt = 2 * (FrameNumOffset + frame_num);
843
844
if (!priv->picture.h264.field_pic_flag) {
845
priv->picture.h264.field_order_cnt[0] = tempPicOrderCnt;
846
priv->picture.h264.field_order_cnt[1] = tempPicOrderCnt;
847
848
} else if (!priv->picture.h264.bottom_field_flag)
849
priv->picture.h264.field_order_cnt[0] = tempPicOrderCnt;
850
else
851
priv->picture.h264.field_order_cnt[1] = tempPicOrderCnt;
852
}
853
854
if (pps->redundant_pic_cnt_present_flag)
855
/* redundant_pic_cnt */
856
vl_rbsp_ue(rbsp);
857
858
if (slice_type == PIPE_H264_SLICE_TYPE_B)
859
/* direct_spatial_mv_pred_flag */
860
vl_rbsp_u(rbsp, 1);
861
862
priv->picture.h264.num_ref_idx_l0_active_minus1 = pps->num_ref_idx_l0_default_active_minus1;
863
priv->picture.h264.num_ref_idx_l1_active_minus1 = pps->num_ref_idx_l1_default_active_minus1;
864
865
if (slice_type == PIPE_H264_SLICE_TYPE_P ||
866
slice_type == PIPE_H264_SLICE_TYPE_SP ||
867
slice_type == PIPE_H264_SLICE_TYPE_B) {
868
869
/* num_ref_idx_active_override_flag */
870
if (vl_rbsp_u(rbsp, 1)) {
871
priv->picture.h264.num_ref_idx_l0_active_minus1 = vl_rbsp_ue(rbsp);
872
873
if (slice_type == PIPE_H264_SLICE_TYPE_B)
874
priv->picture.h264.num_ref_idx_l1_active_minus1 = vl_rbsp_ue(rbsp);
875
}
876
}
877
878
if (nal_unit_type == 20 || nal_unit_type == 21)
879
ref_pic_list_mvc_modification(priv, rbsp);
880
else
881
ref_pic_list_modification(priv, rbsp, slice_type);
882
883
if ((pps->weighted_pred_flag && (slice_type == PIPE_H264_SLICE_TYPE_P || slice_type == PIPE_H264_SLICE_TYPE_SP)) ||
884
(pps->weighted_bipred_idc == 1 && slice_type == PIPE_H264_SLICE_TYPE_B))
885
pred_weight_table(priv, rbsp, sps, slice_type);
886
887
if (nal_ref_idc != 0)
888
dec_ref_pic_marking(priv, rbsp, IdrPicFlag);
889
890
if (pps->entropy_coding_mode_flag && slice_type != PIPE_H264_SLICE_TYPE_I && slice_type != PIPE_H264_SLICE_TYPE_SI)
891
/* cabac_init_idc */
892
vl_rbsp_ue(rbsp);
893
894
/* slice_qp_delta */
895
vl_rbsp_se(rbsp);
896
897
if (slice_type == PIPE_H264_SLICE_TYPE_SP || slice_type == PIPE_H264_SLICE_TYPE_SI) {
898
if (slice_type == PIPE_H264_SLICE_TYPE_SP)
899
/* sp_for_switch_flag */
900
vl_rbsp_u(rbsp, 1);
901
902
/*slice_qs_delta */
903
vl_rbsp_se(rbsp);
904
}
905
906
if (pps->deblocking_filter_control_present_flag) {
907
unsigned disable_deblocking_filter_idc = vl_rbsp_ue(rbsp);
908
909
if (disable_deblocking_filter_idc != 1) {
910
/* slice_alpha_c0_offset_div2 */
911
vl_rbsp_se(rbsp);
912
913
/* slice_beta_offset_div2 */
914
vl_rbsp_se(rbsp);
915
}
916
}
917
918
if (pps->num_slice_groups_minus1 > 0 && pps->slice_group_map_type >= 3 && pps->slice_group_map_type <= 5)
919
/* slice_group_change_cycle */
920
vl_rbsp_u(rbsp, 2);
921
}
922
923
#if ENABLE_ST_OMX_TIZONIA
924
static OMX_ERRORTYPE update_port_parameters(vid_dec_PrivateType* priv) {
925
OMX_VIDEO_PORTDEFINITIONTYPE * p_def = NULL; /* Output port info */
926
h264d_stream_info_t * i_def = NULL; /* Info read from stream */
927
OMX_ERRORTYPE err = OMX_ErrorNone;
928
929
assert(priv);
930
931
p_def = &(priv->out_port_def_.format.video);
932
i_def = &(priv->stream_info);
933
934
/* Handle dynamic resolution change */
935
if ((p_def->nFrameWidth == i_def->width) && p_def->nFrameHeight == i_def->height)
936
return err;
937
938
p_def->nFrameWidth = i_def->width;
939
p_def->nFrameHeight = i_def->height;
940
p_def->nStride = i_def->width;
941
p_def->nSliceHeight = i_def->height;
942
943
err = tiz_krn_SetParameter_internal(tiz_get_krn(handleOf(priv)), handleOf(priv),
944
OMX_IndexParamPortDefinition, &(priv->out_port_def_));
945
if (err == OMX_ErrorNone) {
946
tiz_port_t * p_obj = tiz_krn_get_port(tiz_get_krn(handleOf(priv)), OMX_VID_DEC_AVC_INPUT_PORT_INDEX);
947
948
/* Set desired buffer size that will be used when allocating input buffers */
949
p_obj->portdef_.nBufferSize = p_def->nFrameWidth * p_def->nFrameHeight * 512 / (16*16);
950
951
/* Get a locally copy of port def. Useful for the early return above */
952
tiz_check_omx(tiz_api_GetParameter(tiz_get_krn(handleOf(priv)), handleOf(priv),
953
OMX_IndexParamPortDefinition, &(priv->out_port_def_)));
954
955
tiz_srv_issue_event((OMX_PTR) priv, OMX_EventPortSettingsChanged,
956
OMX_VID_DEC_AVC_OUTPUT_PORT_INDEX,
957
OMX_IndexParamPortDefinition,
958
NULL);
959
}
960
961
return err;
962
}
963
#endif
964
965
void vid_dec_h264_Decode(vid_dec_PrivateType *priv, struct vl_vlc *vlc, unsigned min_bits_left)
966
{
967
unsigned nal_ref_idc, nal_unit_type;
968
969
if (!vl_vlc_search_byte(vlc, vl_vlc_bits_left(vlc) - min_bits_left, 0x00))
970
return;
971
972
if (vl_vlc_peekbits(vlc, 24) != 0x000001) {
973
vl_vlc_eatbits(vlc, 8);
974
return;
975
}
976
977
if (priv->slice) {
978
unsigned bytes = priv->bytes_left - (vl_vlc_bits_left(vlc) / 8);
979
++priv->picture.h264.slice_count;
980
priv->codec->decode_bitstream(priv->codec, priv->target, &priv->picture.base,
981
1, &priv->slice, &bytes);
982
priv->slice = NULL;
983
}
984
985
vl_vlc_eatbits(vlc, 24);
986
987
/* forbidden_zero_bit */
988
vl_vlc_eatbits(vlc, 1);
989
990
nal_ref_idc = vl_vlc_get_uimsbf(vlc, 2);
991
992
if (nal_ref_idc != priv->codec_data.h264.nal_ref_idc &&
993
(nal_ref_idc * priv->codec_data.h264.nal_ref_idc) == 0)
994
vid_dec_h264_EndFrame(priv);
995
996
priv->codec_data.h264.nal_ref_idc = nal_ref_idc;
997
998
nal_unit_type = vl_vlc_get_uimsbf(vlc, 5);
999
1000
if (nal_unit_type != 1 && nal_unit_type != 5)
1001
vid_dec_h264_EndFrame(priv);
1002
1003
if (nal_unit_type == 7) {
1004
struct vl_rbsp rbsp;
1005
vl_rbsp_init(&rbsp, vlc, ~0);
1006
seq_parameter_set(priv, &rbsp);
1007
#if ENABLE_ST_OMX_TIZONIA
1008
update_port_parameters(priv);
1009
#endif
1010
1011
} else if (nal_unit_type == 8) {
1012
struct vl_rbsp rbsp;
1013
vl_rbsp_init(&rbsp, vlc, ~0);
1014
picture_parameter_set(priv, &rbsp);
1015
1016
} else if (nal_unit_type == 1 || nal_unit_type == 5) {
1017
/* Coded slice of a non-IDR or IDR picture */
1018
unsigned bits = vl_vlc_valid_bits(vlc);
1019
unsigned bytes = bits / 8 + 4;
1020
struct vl_rbsp rbsp;
1021
uint8_t buf[8];
1022
const void *ptr = buf;
1023
unsigned i;
1024
1025
buf[0] = 0x0;
1026
buf[1] = 0x0;
1027
buf[2] = 0x1;
1028
buf[3] = (nal_ref_idc << 5) | nal_unit_type;
1029
for (i = 4; i < bytes; ++i)
1030
buf[i] = vl_vlc_peekbits(vlc, bits) >> ((bytes - i - 1) * 8);
1031
1032
priv->bytes_left = (vl_vlc_bits_left(vlc) - bits) / 8;
1033
priv->slice = vlc->data;
1034
1035
vl_rbsp_init(&rbsp, vlc, 128);
1036
slice_header(priv, &rbsp, nal_ref_idc, nal_unit_type);
1037
1038
vid_dec_h264_BeginFrame(priv);
1039
1040
++priv->picture.h264.slice_count;
1041
priv->codec->decode_bitstream(priv->codec, priv->target, &priv->picture.base,
1042
1, &ptr, &bytes);
1043
}
1044
1045
/* resync to byte boundary */
1046
vl_vlc_eatbits(vlc, vl_vlc_valid_bits(vlc) % 8);
1047
}
1048
1049
void vid_dec_FreeInputPortPrivate(OMX_BUFFERHEADERTYPE *buf)
1050
{
1051
struct pipe_video_buffer *vbuf = buf->pInputPortPrivate;
1052
if (!vbuf)
1053
return;
1054
1055
vbuf->destroy(vbuf);
1056
buf->pInputPortPrivate = NULL;
1057
}
1058
1059
void vid_dec_FrameDecoded_common(vid_dec_PrivateType* priv, OMX_BUFFERHEADERTYPE* input,
1060
OMX_BUFFERHEADERTYPE* output)
1061
{
1062
#if ENABLE_ST_OMX_BELLAGIO
1063
bool eos = !!(input->nFlags & OMX_BUFFERFLAG_EOS);
1064
#else
1065
bool eos = priv->eos_;
1066
#endif
1067
OMX_TICKS timestamp;
1068
1069
if (!input->pInputPortPrivate) {
1070
#if ENABLE_ST_OMX_BELLAGIO
1071
input->pInputPortPrivate = priv->Flush(priv, &timestamp);
1072
#else
1073
input->pInputPortPrivate = vid_dec_h264_Flush(priv, &timestamp);
1074
#endif
1075
if (timestamp != OMX_VID_DEC_AVC_TIMESTAMP_INVALID)
1076
input->nTimeStamp = timestamp;
1077
}
1078
1079
if (input->pInputPortPrivate) {
1080
if (output->pInputPortPrivate && !priv->disable_tunnel) {
1081
struct pipe_video_buffer *tmp, *vbuf, *new_vbuf;
1082
1083
tmp = output->pOutputPortPrivate;
1084
vbuf = input->pInputPortPrivate;
1085
if (vbuf->interlaced) {
1086
/* re-allocate the progressive buffer */
1087
struct pipe_video_buffer templat = {};
1088
struct u_rect src_rect, dst_rect;
1089
1090
#if ENABLE_ST_OMX_BELLAGIO
1091
omx_base_video_PortType *port;
1092
port = (omx_base_video_PortType *)
1093
priv->ports[OMX_BASE_FILTER_INPUTPORT_INDEX];
1094
#else
1095
tiz_port_t *port;
1096
port = tiz_krn_get_port(tiz_get_krn(handleOf (priv)), OMX_VID_DEC_AVC_INPUT_PORT_INDEX);
1097
#endif
1098
memset(&templat, 0, sizeof(templat));
1099
#if ENABLE_ST_OMX_BELLAGIO
1100
templat.width = port->sPortParam.format.video.nFrameWidth;
1101
templat.height = port->sPortParam.format.video.nFrameHeight;
1102
#else
1103
templat.width = port->portdef_.format.video.nFrameWidth;
1104
templat.height = port->portdef_.format.video.nFrameHeight;
1105
#endif
1106
templat.buffer_format = PIPE_FORMAT_NV12;
1107
templat.interlaced = false;
1108
new_vbuf = priv->pipe->create_video_buffer(priv->pipe, &templat);
1109
1110
/* convert the interlaced to the progressive */
1111
src_rect.x0 = dst_rect.x0 = 0;
1112
src_rect.x1 = dst_rect.x1 = templat.width;
1113
src_rect.y0 = dst_rect.y0 = 0;
1114
src_rect.y1 = dst_rect.y1 = templat.height;
1115
1116
vl_compositor_yuv_deint_full(&priv->cstate, &priv->compositor,
1117
input->pInputPortPrivate, new_vbuf,
1118
&src_rect, &dst_rect, VL_COMPOSITOR_WEAVE);
1119
1120
/* set the progrssive buffer for next round */
1121
vbuf->destroy(vbuf);
1122
input->pInputPortPrivate = new_vbuf;
1123
}
1124
output->pOutputPortPrivate = input->pInputPortPrivate;
1125
input->pInputPortPrivate = tmp;
1126
} else {
1127
vid_dec_FillOutput(priv, input->pInputPortPrivate, output);
1128
}
1129
output->nFilledLen = output->nAllocLen;
1130
output->nTimeStamp = input->nTimeStamp;
1131
}
1132
1133
if (eos && input->pInputPortPrivate)
1134
vid_dec_FreeInputPortPrivate(input);
1135
else
1136
input->nFilledLen = 0;
1137
}
1138
1139