1 /**********
2 This library is free software; you can redistribute it and/or modify it under
3 the terms of the GNU Lesser General Public License as published by the
4 Free Software Foundation; either version 3 of the License, or (at your
5 option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
6 
7 This library is distributed in the hope that it will be useful, but WITHOUT
8 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
9 FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
10 more details.
11 
12 You should have received a copy of the GNU Lesser General Public License
13 along with this library; if not, write to the Free Software Foundation, Inc.,
14 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
15 **********/
16 // "liveMedia"
17 // Copyright (c) 1996-2020 Live Networks, Inc.  All rights reserved.
18 // AC3 Audio RTP Sources
19 // Implementation
20 
21 #include "AC3AudioRTPSource.hh"
22 
23 AC3AudioRTPSource*
createNew(UsageEnvironment & env,Groupsock * RTPgs,unsigned char rtpPayloadFormat,unsigned rtpTimestampFrequency)24 AC3AudioRTPSource::createNew(UsageEnvironment& env,
25 			      Groupsock* RTPgs,
26 			      unsigned char rtpPayloadFormat,
27 			      unsigned rtpTimestampFrequency) {
28   return new AC3AudioRTPSource(env, RTPgs, rtpPayloadFormat,
29 				rtpTimestampFrequency);
30 }
31 
AC3AudioRTPSource(UsageEnvironment & env,Groupsock * rtpGS,unsigned char rtpPayloadFormat,unsigned rtpTimestampFrequency)32 AC3AudioRTPSource::AC3AudioRTPSource(UsageEnvironment& env,
33 				       Groupsock* rtpGS,
34 				       unsigned char rtpPayloadFormat,
35 				       unsigned rtpTimestampFrequency)
36   : MultiFramedRTPSource(env, rtpGS,
37 			 rtpPayloadFormat, rtpTimestampFrequency) {
38 }
39 
~AC3AudioRTPSource()40 AC3AudioRTPSource::~AC3AudioRTPSource() {
41 }
42 
43 Boolean AC3AudioRTPSource
processSpecialHeader(BufferedPacket * packet,unsigned & resultSpecialHeaderSize)44 ::processSpecialHeader(BufferedPacket* packet,
45 		       unsigned& resultSpecialHeaderSize) {
46   unsigned char* headerStart = packet->data();
47   unsigned packetSize = packet->dataSize();
48 
49   // There's a 2-byte payload header at the beginning:
50   if (packetSize < 2) return False;
51   resultSpecialHeaderSize = 2;
52 
53   unsigned char FT = headerStart[0]&0x03;
54   fCurrentPacketBeginsFrame = FT != 3;
55 
56   // The RTP "M" (marker) bit indicates the last fragment of a frame.
57   // In case the sender did not set the "M" bit correctly, we also test for FT == 0:
58   fCurrentPacketCompletesFrame = packet->rtpMarkerBit() || FT == 0;
59 
60   return True;
61 }
62 
MIMEtype() const63 char const* AC3AudioRTPSource::MIMEtype() const {
64   return "audio/AC3";
65 }
66 
67