1 | /* GStreamer |
2 | * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu> |
3 | * Library <2001> Thomas Vander Stichele <thomas@apestaart.org> |
4 | * <2011> Wim Taymans <wim.taymans@gmail.com> |
5 | * |
6 | * This library is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Library General Public |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2 of the License, or (at your option) any later version. |
10 | * |
11 | * This library is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * Library General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Library General Public |
17 | * License along with this library; if not, write to the |
18 | * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, |
19 | * Boston, MA 02110-1301, USA. |
20 | */ |
21 | |
22 | #ifndef __GST_AUDIO_AUDIO_H__ |
23 | #include <gst/audio/audio.h> |
24 | #endif |
25 | |
26 | #ifndef __GST_AUDIO_CHANNELS_H__ |
27 | #define __GST_AUDIO_CHANNELS_H__ |
28 | |
29 | G_BEGIN_DECLS |
30 | |
31 | /** |
32 | * GstAudioChannelPosition: |
33 | * @GST_AUDIO_CHANNEL_POSITION_MONO: Mono without direction; |
34 | * can only be used with 1 channel |
35 | * @GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT: Front left |
36 | * @GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT: Front right |
37 | * @GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER: Front center |
38 | * @GST_AUDIO_CHANNEL_POSITION_LFE1: Low-frequency effects 1 (subwoofer) |
39 | * @GST_AUDIO_CHANNEL_POSITION_REAR_LEFT: Rear left |
40 | * @GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT: Rear right |
41 | * @GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER: Front left of center |
42 | * @GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER: Front right of center |
43 | * @GST_AUDIO_CHANNEL_POSITION_REAR_CENTER: Rear center |
44 | * @GST_AUDIO_CHANNEL_POSITION_LFE2: Low-frequency effects 2 (subwoofer) |
45 | * @GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT: Side left |
46 | * @GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT: Side right |
47 | * @GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT: Top front left |
48 | * @GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT: Top front right |
49 | * @GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER: Top front center |
50 | * @GST_AUDIO_CHANNEL_POSITION_TOP_CENTER: Top center |
51 | * @GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT: Top rear left |
52 | * @GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT: Top rear right |
53 | * @GST_AUDIO_CHANNEL_POSITION_TOP_SIDE_LEFT: Top side right |
54 | * @GST_AUDIO_CHANNEL_POSITION_TOP_SIDE_RIGHT: Top rear right |
55 | * @GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER: Top rear center |
56 | * @GST_AUDIO_CHANNEL_POSITION_BOTTOM_FRONT_CENTER: Bottom front center |
57 | * @GST_AUDIO_CHANNEL_POSITION_BOTTOM_FRONT_LEFT: Bottom front left |
58 | * @GST_AUDIO_CHANNEL_POSITION_BOTTOM_FRONT_RIGHT: Bottom front right |
59 | * @GST_AUDIO_CHANNEL_POSITION_WIDE_LEFT: Wide left (between front left and side left) |
60 | * @GST_AUDIO_CHANNEL_POSITION_WIDE_RIGHT: Wide right (between front right and side right) |
61 | * @GST_AUDIO_CHANNEL_POSITION_SURROUND_LEFT: Surround left (between rear left and side left) |
62 | * @GST_AUDIO_CHANNEL_POSITION_SURROUND_RIGHT: Surround right (between rear right and side right) |
63 | * @GST_AUDIO_CHANNEL_POSITION_NONE: used for position-less channels, e.g. |
64 | * from a sound card that records 1024 channels; mutually exclusive with |
65 | * any other channel position |
66 | * @GST_AUDIO_CHANNEL_POSITION_INVALID: invalid position |
67 | * |
68 | * Audio channel positions. |
69 | * |
70 | * These are the channels defined in SMPTE 2036-2-2008 |
71 | * Table 1 for 22.2 audio systems with the Surround and Wide channels from |
72 | * DTS Coherent Acoustics (v.1.3.1) and 10.2 and 7.1 layouts. In the caps the |
73 | * actual channel layout is expressed with a channel count and a channel mask, |
74 | * which describes the existing channels. The positions in the bit mask correspond |
75 | * to the enum values. |
76 | * For negotiation it is allowed to have more bits set in the channel mask than |
77 | * the number of channels to specify the allowed channel positions but this is |
78 | * not allowed in negotiated caps. It is not allowed in any situation other |
79 | * than the one mentioned below to have less bits set in the channel mask than |
80 | * the number of channels. |
81 | * |
82 | * @GST_AUDIO_CHANNEL_POSITION_MONO can only be used with a single mono channel that |
83 | * has no direction information and would be mixed into all directional channels. |
84 | * This is expressed in caps by having a single channel and no channel mask. |
85 | * |
86 | * @GST_AUDIO_CHANNEL_POSITION_NONE can only be used if all channels have this position. |
87 | * This is expressed in caps by having a channel mask with no bits set. |
88 | * |
89 | * As another special case it is allowed to have two channels without a channel mask. |
90 | * This implicitly means that this is a stereo stream with a front left and front right |
91 | * channel. |
92 | */ |
93 | typedef enum { |
94 | /* These get negative indices to allow to use |
95 | * the enum values of the normal cases for the |
96 | * bit-mask position */ |
97 | GST_AUDIO_CHANNEL_POSITION_NONE = -3, |
98 | GST_AUDIO_CHANNEL_POSITION_MONO = -2, |
99 | GST_AUDIO_CHANNEL_POSITION_INVALID = -1, |
100 | |
101 | /* Normal cases */ |
102 | GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT = 0, |
103 | GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, |
104 | GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, |
105 | GST_AUDIO_CHANNEL_POSITION_LFE1, |
106 | GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, |
107 | GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, |
108 | GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER, |
109 | GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, |
110 | GST_AUDIO_CHANNEL_POSITION_REAR_CENTER, |
111 | GST_AUDIO_CHANNEL_POSITION_LFE2, |
112 | GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, |
113 | GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, |
114 | GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT, |
115 | GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT, |
116 | GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER, |
117 | GST_AUDIO_CHANNEL_POSITION_TOP_CENTER, |
118 | GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT, |
119 | GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT, |
120 | GST_AUDIO_CHANNEL_POSITION_TOP_SIDE_LEFT, |
121 | GST_AUDIO_CHANNEL_POSITION_TOP_SIDE_RIGHT, |
122 | GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER, |
123 | GST_AUDIO_CHANNEL_POSITION_BOTTOM_FRONT_CENTER, |
124 | GST_AUDIO_CHANNEL_POSITION_BOTTOM_FRONT_LEFT, |
125 | GST_AUDIO_CHANNEL_POSITION_BOTTOM_FRONT_RIGHT, |
126 | GST_AUDIO_CHANNEL_POSITION_WIDE_LEFT, |
127 | GST_AUDIO_CHANNEL_POSITION_WIDE_RIGHT, |
128 | GST_AUDIO_CHANNEL_POSITION_SURROUND_LEFT, |
129 | GST_AUDIO_CHANNEL_POSITION_SURROUND_RIGHT |
130 | } GstAudioChannelPosition; |
131 | |
132 | #define GST_AUDIO_CHANNEL_POSITION_MASK(pos) (G_GUINT64_CONSTANT(1)<< GST_AUDIO_CHANNEL_POSITION_ ## pos) |
133 | |
134 | GST_AUDIO_API |
135 | gboolean gst_audio_buffer_reorder_channels (GstBuffer * buffer, |
136 | GstAudioFormat format, |
137 | gint channels, |
138 | const GstAudioChannelPosition * from, |
139 | const GstAudioChannelPosition * to); |
140 | |
141 | GST_AUDIO_API |
142 | gboolean gst_audio_reorder_channels (gpointer data, gsize size, |
143 | GstAudioFormat format, |
144 | gint channels, |
145 | const GstAudioChannelPosition * from, |
146 | const GstAudioChannelPosition * to); |
147 | |
148 | GST_AUDIO_API |
149 | gboolean gst_audio_channel_positions_to_valid_order (GstAudioChannelPosition *position, |
150 | gint channels); |
151 | |
152 | GST_AUDIO_API |
153 | gboolean gst_audio_check_valid_channel_positions (const GstAudioChannelPosition *position, |
154 | gint channels, gboolean force_order); |
155 | |
156 | GST_AUDIO_API |
157 | gboolean gst_audio_channel_positions_to_mask (const GstAudioChannelPosition *position, |
158 | gint channels, gboolean force_order, |
159 | guint64 *channel_mask); |
160 | |
161 | GST_AUDIO_API |
162 | gboolean gst_audio_channel_positions_from_mask (gint channels, guint64 channel_mask, |
163 | GstAudioChannelPosition * position); |
164 | |
165 | GST_AUDIO_API |
166 | gboolean gst_audio_get_channel_reorder_map (gint channels, |
167 | const GstAudioChannelPosition * from, |
168 | const GstAudioChannelPosition * to, |
169 | gint *reorder_map); |
170 | |
171 | GST_AUDIO_API |
172 | guint64 gst_audio_channel_get_fallback_mask (gint channels); |
173 | |
174 | GST_AUDIO_API |
175 | gchar* gst_audio_channel_positions_to_string (const GstAudioChannelPosition * position, |
176 | gint channels); |
177 | |
178 | G_END_DECLS |
179 | |
180 | #endif /* __GST_AUDIO_CHANNELS_H__ */ |
181 | |