replace SPDX identifier GPL-2.0+ with GPL-2.0-or-later.
[metze/wireshark/wip.git] / wsutil / mpeg-audio.h
1 /* mpeg-audio.h
2  *
3  * MPEG Audio header dissection
4  * Written by Shaun Jackman <sjackman@gmail.com>
5  * Copyright 2007 Shaun Jackman
6  *
7  * Wiretap Library
8  * SPDX-License-Identifier: GPL-2.0-or-later
9  */
10
11 #ifndef MPA_H
12 #define MPA_H 1
13
14 #include "ws_symbol_export.h"
15
16 struct mpa {
17         unsigned int emphasis   :2;
18         unsigned int original   :1;
19         unsigned int copyright  :1;
20         unsigned int modeext    :2;
21         unsigned int mode       :2;
22         unsigned int priv       :1;
23         unsigned int padding    :1;
24         unsigned int frequency  :2;
25         unsigned int bitrate    :4;
26         unsigned int protection :1;
27         unsigned int layer      :2;
28         unsigned int version    :2;
29         unsigned int sync       :11;
30 };
31
32 #define MPA_UNMARSHAL_SYNC(n)       ((n) >> 21 & 0x7ff)
33 #define MPA_UNMARSHAL_VERSION(n)    ((n) >> 19 & 0x3)
34 #define MPA_UNMARSHAL_LAYER(n)      ((n) >> 17 & 0x3)
35 #define MPA_UNMARSHAL_PROTECTION(n) ((n) >> 16 & 0x1)
36 #define MPA_UNMARSHAL_BITRATE(n)    ((n) >> 12 & 0xf)
37 #define MPA_UNMARSHAL_FREQUENCY(n)  ((n) >> 10 & 0x3)
38 #define MPA_UNMARSHAL_PADDING(n)    ((n) >>  9 & 0x1)
39 #define MPA_UNMARSHAL_PRIVATE(n)    ((n) >>  8 & 0x1)
40 #define MPA_UNMARSHAL_MODE(n)       ((n) >>  6 & 0x3)
41 #define MPA_UNMARSHAL_MODEEXT(n)    ((n) >>  4 & 0x3)
42 #define MPA_UNMARSHAL_COPYRIGHT(n)  ((n) >>  3 & 0x1)
43 #define MPA_UNMARSHAL_ORIGINAL(n)   ((n) >>  2 & 0x1)
44 #define MPA_UNMARSHAL_EMPHASIS(n)   ((n) >>  0 & 0x3)
45
46 #define MPA_UNMARSHAL(mpa, n) do { \
47         (mpa)->sync       = MPA_UNMARSHAL_SYNC(n);       \
48         (mpa)->version    = MPA_UNMARSHAL_VERSION(n);    \
49         (mpa)->layer      = MPA_UNMARSHAL_LAYER(n);      \
50         (mpa)->protection = MPA_UNMARSHAL_PROTECTION(n); \
51         (mpa)->bitrate    = MPA_UNMARSHAL_BITRATE(n);    \
52         (mpa)->frequency  = MPA_UNMARSHAL_FREQUENCY(n);  \
53         (mpa)->padding    = MPA_UNMARSHAL_PADDING(n);    \
54         (mpa)->priv       = MPA_UNMARSHAL_PRIVATE(n);    \
55         (mpa)->mode       = MPA_UNMARSHAL_MODE(n);       \
56         (mpa)->modeext    = MPA_UNMARSHAL_MODEEXT(n);    \
57         (mpa)->copyright  = MPA_UNMARSHAL_COPYRIGHT(n);  \
58         (mpa)->original   = MPA_UNMARSHAL_ORIGINAL(n);   \
59         (mpa)->emphasis   = MPA_UNMARSHAL_EMPHASIS(n);   \
60         } while (0)
61
62 WS_DLL_PUBLIC
63 int mpa_version(const struct mpa *);
64 WS_DLL_PUBLIC
65 int mpa_layer(const struct mpa *);
66 WS_DLL_PUBLIC
67 unsigned int mpa_samples(const struct mpa *);
68 WS_DLL_PUBLIC
69 unsigned int mpa_bitrate(const struct mpa *);
70 WS_DLL_PUBLIC
71 unsigned int mpa_frequency(const struct mpa *);
72 WS_DLL_PUBLIC
73 unsigned int mpa_padding(const struct mpa *);
74
75 #define MPA_DATA_BYTES(mpa) (mpa_bitrate(mpa) * mpa_samples(mpa) \
76                 / mpa_frequency(mpa) / 8)
77 #define MPA_BYTES(mpa) (MPA_DATA_BYTES(mpa) + mpa_padding(mpa))
78 #define MPA_DURATION_NS(mpa) \
79         (1000000000 / mpa_frequency(mpa) * mpa_samples(mpa))
80
81 enum { MPA_SYNC = 0x7ff };
82
83 #define MPA_SYNC_VALID(mpa)      ((mpa)->sync == MPA_SYNC)
84 #define MPA_VERSION_VALID(mpa)   (mpa_version(mpa) >= 0)
85 #define MPA_LAYER_VALID(mpa)     (mpa_layer(mpa) >= 0)
86 #define MPA_BITRATE_VALID(mpa)   (mpa_bitrate(mpa) > 0)
87 #define MPA_FREQUENCY_VALID(mpa) (mpa_frequency(mpa) > 0)
88 #define MPA_VALID(mpa) (MPA_SYNC_VALID(mpa) \
89                 && MPA_VERSION_VALID(mpa) && MPA_LAYER_VALID(mpa) \
90                 && MPA_BITRATE_VALID(mpa) && MPA_FREQUENCY_VALID(mpa))
91
92 #endif