1/**
2 * viddec_mpeg2_frame_attr.c
3 * -------------------------
4 * This is a helper file for viddec_mpeg2_workload.c to translate the data
5 * stored in the parser context into frame attributes in the workload.
6 */
7
8#include "viddec_mpeg2.h"
9
10/* viddec_mpeg2_print_attr() - Prints collected frame attributes             */
11static inline void viddec_mpeg2_print_attr(viddec_frame_attributes_t *attr)
12{
13    unsigned int index = 0;
14
15    MPEG2_FA_DEB("Content_Size=%dx%d\n",        attr->cont_size.width,
16                                                attr->cont_size.height);
17    MPEG2_FA_DEB("Repeat=%d\n",                 attr->mpeg2.repeat_first_field);
18    MPEG2_FA_DEB("Frame_Type=%d\n",             attr->frame_type);
19    MPEG2_FA_DEB("Temporal_Reference=%d\n",     attr->mpeg2.temporal_ref);
20    MPEG2_FA_DEB("Top_Field_First=%d\n",        attr->mpeg2.top_field_first);
21    MPEG2_FA_DEB("Progressive_Frame=%d\n",      attr->mpeg2.progressive_frame);
22    MPEG2_FA_DEB("Picture_Struct=%d\n",         attr->mpeg2.picture_struct);
23    MPEG2_FA_DEB("Pan_Scan_Offsets=%d\n",       attr->mpeg2.number_of_frame_center_offsets);
24
25    for (index = 0; index < attr->mpeg2.number_of_frame_center_offsets; index++)
26    {
27        MPEG2_FA_DEB("\tPan_Scan_Offset_%d= %dx%d\n", index,
28        attr->mpeg2.frame_center_offset[index].horz,
29        attr->mpeg2.frame_center_offset[index].vert);
30    }
31
32    return;
33}
34
35/* viddec_mpeg2_set_default_values() - Resets attributes that are optional   */
36/* in the bitstream to their default values.                                 */
37static inline void viddec_mpeg2_set_default_values(viddec_frame_attributes_t *attrs)
38{
39    unsigned int index = 0;
40
41    attrs->mpeg2.number_of_frame_center_offsets = 0;
42    for (index = 0; index < MPEG2_MAX_VID_OFFSETS ; index++)
43    {
44        attrs->mpeg2.frame_center_offset[index].horz = 0;
45        attrs->mpeg2.frame_center_offset[index].vert = 0;
46    }
47
48    return;
49}
50
51/* viddec_mpeg2_translate_attr() - Translates metadata parsed into frame     */
52/* attributes in the workload                                                */
53void viddec_mpeg2_translate_attr(void *parent, void *ctxt)
54{
55    /* Get MPEG2 Parser context */
56    struct viddec_mpeg2_parser *parser = (struct viddec_mpeg2_parser *) ctxt;
57
58    /* Get workload */
59    viddec_workload_t *wl = viddec_pm_get_header( parent );
60
61    /* Get attributes in workload */
62    viddec_frame_attributes_t *attrs = &wl->attrs;
63
64    /* Get the default values for optional attributes */
65    viddec_mpeg2_set_default_values(attrs);
66
67    /* Populate attributes from parser context */
68    /* Content Size */
69    attrs->cont_size.height         = ((parser->info.seq_ext.vertical_size_extension << 12)
70                                        | parser->info.seq_hdr.vertical_size_value);
71    attrs->cont_size.width          = ((parser->info.seq_ext.horizontal_size_extension << 12)
72                                        | parser->info.seq_hdr.horizontal_size_value);
73
74    /* Repeat field */
75    attrs->mpeg2.repeat_first_field = parser->info.pic_cod_ext.repeat_first_field;
76
77    /* Temporal Reference */
78    attrs->mpeg2.temporal_ref       = parser->info.pic_hdr.temporal_reference;
79
80    /* Top field first */
81    attrs->mpeg2.top_field_first    = parser->info.pic_cod_ext.top_field_first;
82
83    /* Progressive frame */
84    attrs->mpeg2.progressive_frame  = parser->info.pic_cod_ext.progressive_frame;
85
86    /* Picture Structure */
87    attrs->mpeg2.picture_struct     = parser->info.pic_cod_ext.picture_structure;
88
89    /* Populate the frame type */
90    switch (parser->info.pic_hdr.picture_coding_type)
91    {
92        case MPEG2_PC_TYPE_I: attrs->frame_type = VIDDEC_FRAME_TYPE_I; break;
93        case MPEG2_PC_TYPE_P: attrs->frame_type = VIDDEC_FRAME_TYPE_P; break;
94        case MPEG2_PC_TYPE_B: attrs->frame_type = VIDDEC_FRAME_TYPE_B; break;
95        default:              attrs->frame_type = VIDDEC_FRAME_TYPE_INVALID;
96    }
97
98    /* Update PanScan data */
99    if (parser->mpeg2_curr_frame_headers & MPEG2_HEADER_PIC_DISP_EXT)
100    {
101        unsigned int index = 0;
102        attrs->mpeg2.number_of_frame_center_offsets = parser->mpeg2_num_pan_scan_offsets;
103        for (index = 0; index < parser->mpeg2_num_pan_scan_offsets; index++)
104        {
105            attrs->mpeg2.frame_center_offset[index].horz = parser->info.pic_disp_ext.frame_center_horizontal_offset[index];
106            attrs->mpeg2.frame_center_offset[index].vert = parser->info.pic_disp_ext.frame_center_vertical_offset[index];
107        }
108    }
109
110    /* Print frame attributes */
111    viddec_mpeg2_print_attr(attrs);
112
113    return;
114}
115