blob: b46c33f7e2febe4e2b87f0e295bd458d7c4e02d4
1 | /* |
2 | * VC-1 and WMV3 decoder |
3 | * Copyright (c) 2006-2007 Konstantin Shishkov |
4 | * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer |
5 | * |
6 | * This file is part of FFmpeg. |
7 | * |
8 | * FFmpeg is free software; you can redistribute it and/or |
9 | * modify it under the terms of the GNU Lesser General Public |
10 | * License as published by the Free Software Foundation; either |
11 | * version 2.1 of the License, or (at your option) any later version. |
12 | * |
13 | * FFmpeg is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 | * Lesser General Public License for more details. |
17 | * |
18 | * You should have received a copy of the GNU Lesser General Public |
19 | * License along with FFmpeg; if not, write to the Free Software |
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 | */ |
22 | |
23 | #ifndef AVCODEC_VC1_COMMON_H |
24 | #define AVCODEC_VC1_COMMON_H |
25 | |
26 | #include <stdint.h> |
27 | |
28 | #include "libavutil/attributes.h" |
29 | #include "internal.h" |
30 | |
31 | /** Markers used in VC-1 AP frame data */ |
32 | //@{ |
33 | enum VC1Code { |
34 | VC1_CODE_RES0 = 0x00000100, |
35 | VC1_CODE_ENDOFSEQ = 0x0000010A, |
36 | VC1_CODE_SLICE, |
37 | VC1_CODE_FIELD, |
38 | VC1_CODE_FRAME, |
39 | VC1_CODE_ENTRYPOINT, |
40 | VC1_CODE_SEQHDR, |
41 | }; |
42 | //@} |
43 | |
44 | #define IS_MARKER(x) (((x) & ~0xFF) == VC1_CODE_RES0) |
45 | |
46 | /** Available Profiles */ |
47 | //@{ |
48 | enum Profile { |
49 | PROFILE_SIMPLE, |
50 | PROFILE_MAIN, |
51 | PROFILE_COMPLEX, ///< TODO: WMV9 specific |
52 | PROFILE_ADVANCED |
53 | }; |
54 | //@} |
55 | |
56 | /** Find VC-1 marker in buffer |
57 | * @return position where next marker starts or end of buffer if no marker found |
58 | */ |
59 | static av_always_inline const uint8_t* find_next_marker(const uint8_t *src, const uint8_t *end) |
60 | { |
61 | if (end - src >= 4) { |
62 | uint32_t mrk = 0xFFFFFFFF; |
63 | src = avpriv_find_start_code(src, end, &mrk); |
64 | if (IS_MARKER(mrk)) |
65 | return src - 4; |
66 | } |
67 | return end; |
68 | } |
69 | |
70 | static av_always_inline int vc1_unescape_buffer(const uint8_t *src, int size, uint8_t *dst) |
71 | { |
72 | int dsize = 0, i; |
73 | |
74 | if (size < 4) { |
75 | for (dsize = 0; dsize < size; dsize++) |
76 | *dst++ = *src++; |
77 | return size; |
78 | } |
79 | for (i = 0; i < size; i++, src++) { |
80 | if (src[0] == 3 && i >= 2 && !src[-1] && !src[-2] && i < size-1 && src[1] < 4) { |
81 | dst[dsize++] = src[1]; |
82 | src++; |
83 | i++; |
84 | } else |
85 | dst[dsize++] = *src; |
86 | } |
87 | return dsize; |
88 | } |
89 | |
90 | #endif /* AVCODEC_VC1_COMMON_H */ |
91 |