1 /* ///////////////////////////////////////////////////////////////////////
2 //
3 // INTEL CORPORATION PROPRIETARY INFORMATION
4 // This software is supplied under the terms of a license agreement or
5 // nondisclosure agreement with Intel Corporation and may not be copied
6 // or disclosed except in accordance with the terms of that agreement.
7 // Copyright (c) 2008 Intel Corporation. All Rights Reserved.
8 //
9 // Description: Parses VC-1 picture layer for simple and main profiles.
10 //
11 */
12
13 #include "vc1parse.h"
14
15 /*------------------------------------------------------------------------------
16 * Parse picture layer. This function parses the picture header for simple or
17 * main profile down to macroblock layer.
18 * Table 16 of SMPTE 421M after processing up to PTYPE for I picture.
19 * Table 17 of SMPTE 421M after processing up to PTYPE for BI picture.
20 * Table 19 of SMPTE 421M after processing up to PTYPE for P picture.
21 * Table 21 of SMPTE 421M after processing up to PTYPE for B picture.
22 *------------------------------------------------------------------------------
23 */
24
vc1_ParsePictureHeader(void * ctxt,vc1_Info * pInfo)25 vc1_Status vc1_ParsePictureHeader(void* ctxt, vc1_Info *pInfo)
26 {
27 uint32_t tempValue;
28 vc1_Status status = VC1_STATUS_OK;
29 vc1_metadata_t *md = &pInfo->metadata;
30 vc1_PictureLayerHeader *picLayerHeader = &pInfo->picLayerHeader;
31 int32_t result;
32
33 if (md->PROFILE != VC1_PROFILE_ADVANCED)
34 {
35 // As per spec, for main/simple profile, if the size of the coded picture is <= 1B,
36 // it shall be treated as a skipped frame.
37 // In content with skipped frames, the data is "00".
38 // rcv to vc1 conversion process adds an additional byte (0x80) to the picture, hence
39 // the data looks like "00 80"
40 // Hence if data is <= 2B, we will consider it skipped (check for 16+1b, if it fails, the frame is skipped).
41 result = viddec_pm_peek_bits(ctxt, &tempValue, 17);
42 if(result == -1)
43 {
44 picLayerHeader->PTYPE = VC1_SKIPPED_FRAME;
45 return status;
46 }
47 }
48
49 if (md->FINTERPFLAG == 1)
50 {
51 VC1_GET_BITS9(1, tempValue); /* INTERPFRM. */
52 }
53
54 VC1_GET_BITS9(2, tempValue); /* FRMCNT. */
55
56 if (md->RANGERED == 1)
57 {
58 VC1_GET_BITS9(1, picLayerHeader->RANGEREDFRM);
59 }
60
61 if (md->MAXBFRAMES == 0)
62 {
63 VC1_GET_BITS9(1, picLayerHeader->PTYPE);
64 if (picLayerHeader->PTYPE == 0)
65 picLayerHeader->PTYPE = VC1_I_FRAME;
66 else
67 picLayerHeader->PTYPE = VC1_P_FRAME;
68 }
69 else
70 {
71 VC1_GET_BITS9(1, picLayerHeader->PTYPE);
72 if (picLayerHeader->PTYPE == 0)
73 {
74 VC1_GET_BITS9(1, picLayerHeader->PTYPE);
75 if (picLayerHeader->PTYPE == 0) {
76 picLayerHeader->PTYPE = VC1_B_FRAME; /* Or VC1_BI_FRAME. */
77 /* if peek(7) = 0b1111111 then ptype = bi */
78 VC1_PEEK_BITS( 7, tempValue );
79 if ( tempValue == 0x7f )
80 picLayerHeader->PTYPE = VC1_BI_FRAME;
81 } else
82 picLayerHeader->PTYPE = VC1_I_FRAME;
83 }
84 else
85 picLayerHeader->PTYPE = VC1_P_FRAME;
86 }
87
88 if (picLayerHeader->PTYPE == VC1_I_FRAME ||
89 picLayerHeader->PTYPE == VC1_BI_FRAME)
90 {
91 status = vc1_ParsePictureHeader_ProgressiveIpicture(ctxt, pInfo);
92 }
93 else if (picLayerHeader->PTYPE == VC1_P_FRAME)
94 status = vc1_ParsePictureHeader_ProgressivePpicture(ctxt, pInfo);
95 else if (picLayerHeader->PTYPE == VC1_B_FRAME)
96 status = vc1_ParsePictureHeader_ProgressiveBpicture(ctxt, pInfo);
97 else
98 status = VC1_STATUS_PARSE_ERROR;
99
100 return status;
101 }
102