Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
SDK
/
exoplayer
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
718cea8d
authored
Mar 24, 2022
by
Shraddha Basantwani
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Add RTP AMR Reader Test
Change-Id: Ic8bdffc25b5babf7ccbbb98f161840eb774888e2
parent
f75710be
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
235 additions
and
0 deletions
libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/reader/RtpAmrReaderTest.java
libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/reader/RtpAmrReaderTest.java
0 → 100644
View file @
718cea8d
/*
* Copyright 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
androidx
.
media3
.
exoplayer
.
rtsp
.
reader
;
import
static
androidx
.
media3
.
common
.
util
.
Util
.
getBytesFromHexString
;
import
static
com
.
google
.
common
.
truth
.
Truth
.
assertThat
;
import
static
org
.
mockito
.
ArgumentMatchers
.
anyInt
;
import
static
org
.
mockito
.
Mockito
.
when
;
import
androidx.media3.common.Format
;
import
androidx.media3.common.MimeTypes
;
import
androidx.media3.common.util.ParsableByteArray
;
import
androidx.media3.exoplayer.rtsp.RtpPacket
;
import
androidx.media3.exoplayer.rtsp.RtpPayloadFormat
;
import
androidx.media3.extractor.ExtractorOutput
;
import
androidx.media3.test.utils.FakeTrackOutput
;
import
androidx.test.ext.junit.runners.AndroidJUnit4
;
import
com.google.common.collect.ImmutableMap
;
import
org.junit.Before
;
import
org.junit.Rule
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.mockito.Mock
;
import
org.mockito.junit.MockitoJUnit
;
import
org.mockito.junit.MockitoRule
;
/** Unit test for {@link RtpAmrReader}. */
@RunWith
(
AndroidJUnit4
.
class
)
public
final
class
RtpAmrReaderTest
{
@Rule
public
final
MockitoRule
mockito
=
MockitoJUnit
.
rule
();
private
ParsableByteArray
packetData
;
private
FakeTrackOutput
trackOutput
;
@Mock
private
ExtractorOutput
extractorOutput
;
@Before
public
void
setUp
()
{
packetData
=
new
ParsableByteArray
();
trackOutput
=
new
FakeTrackOutput
(
/* deduplicateConsecutiveFormats= */
false
);
when
(
extractorOutput
.
track
(
anyInt
(),
anyInt
())).
thenReturn
(
trackOutput
);
}
@Test
public
void
consume_validPackets_AMR_NB
()
{
RtpAmrReader
amrReader
=
createAmrReader
(
MimeTypes
.
AUDIO_AMR
);
RtpPacket
frame1
=
createRtpPacket
(
/* timestamp= */
2599168056L
,
/* sequenceNumber= */
40289
,
/* payloadData= */
getBytesFromHexString
(
"00400102030405"
));
RtpPacket
frame2
=
createRtpPacket
(
/* timestamp= */
2599169592L
,
/* sequenceNumber= */
40290
,
/* payloadData= */
getBytesFromHexString
(
"60C0060708090A"
));
amrReader
.
createTracks
(
extractorOutput
,
/* trackId= */
0
);
amrReader
.
onReceivingFirstPacket
(
frame1
.
timestamp
,
frame1
.
sequenceNumber
);
packetData
.
reset
(
frame1
.
payloadData
);
amrReader
.
consume
(
packetData
,
frame1
.
timestamp
,
frame1
.
sequenceNumber
,
/* isFrameBoundary= */
frame1
.
marker
);
packetData
.
reset
(
frame2
.
payloadData
);
amrReader
.
consume
(
packetData
,
frame2
.
timestamp
,
frame2
.
sequenceNumber
,
/* isFrameBoundary= */
frame2
.
marker
);
assertThat
(
trackOutput
.
getSampleCount
()).
isEqualTo
(
2
);
assertThat
(
trackOutput
.
getSampleData
(
0
)).
isEqualTo
(
getBytesFromHexString
(
"400102030405"
));
assertThat
(
trackOutput
.
getSampleTimeUs
(
0
)).
isEqualTo
(
0
);
assertThat
(
trackOutput
.
getSampleData
(
1
)).
isEqualTo
(
getBytesFromHexString
(
"C0060708090A"
));
assertThat
(
trackOutput
.
getSampleTimeUs
(
1
)).
isEqualTo
(
192000
);
}
@Test
(
expected
=
IllegalArgumentException
.
class
)
public
void
consume_invalidFrameType_AMR_NB
()
{
RtpAmrReader
amrReader
=
createAmrReader
(
MimeTypes
.
AUDIO_AMR
);
RtpPacket
frame1
=
createRtpPacket
(
/* timestamp= */
2599168056L
,
/* sequenceNumber= */
40289
,
/* payloadData= */
getBytesFromHexString
(
"00680102030405"
));
amrReader
.
createTracks
(
extractorOutput
,
/* trackId= */
0
);
amrReader
.
onReceivingFirstPacket
(
frame1
.
timestamp
,
frame1
.
sequenceNumber
);
packetData
.
reset
(
frame1
.
payloadData
);
amrReader
.
consume
(
packetData
,
frame1
.
timestamp
,
frame1
.
sequenceNumber
,
/* isFrameBoundary= */
frame1
.
marker
);
}
@Test
(
expected
=
IllegalArgumentException
.
class
)
public
void
consume_invalidFrameSize_AMR_NB
()
{
RtpAmrReader
amrReader
=
createAmrReader
(
MimeTypes
.
AUDIO_AMR
);
RtpPacket
frame1
=
createRtpPacket
(
/* timestamp= */
2599168056L
,
/* sequenceNumber= */
40289
,
/* payloadData= */
getBytesFromHexString
(
"004001020304"
));
amrReader
.
createTracks
(
extractorOutput
,
/* trackId= */
0
);
amrReader
.
onReceivingFirstPacket
(
frame1
.
timestamp
,
frame1
.
sequenceNumber
);
packetData
.
reset
(
frame1
.
payloadData
);
amrReader
.
consume
(
packetData
,
frame1
.
timestamp
,
frame1
.
sequenceNumber
,
/* isFrameBoundary= */
frame1
.
marker
);
}
@Test
public
void
consume_validPackets_AMR_WB
()
{
RtpAmrReader
amrReader
=
createAmrReader
(
MimeTypes
.
AUDIO_AMR_WB
);
RtpPacket
frame1
=
createRtpPacket
(
/* timestamp= */
2599168056L
,
/* sequenceNumber= */
40289
,
/* payloadData= */
getBytesFromHexString
(
"60870102030405060708090A0B0C0D0E0F1011"
));
RtpPacket
frame2
=
createRtpPacket
(
/* timestamp= */
2599169592L
,
/* sequenceNumber= */
40290
,
/* payloadData= */
getBytesFromHexString
(
"007E"
));
amrReader
.
createTracks
(
extractorOutput
,
/* trackId= */
0
);
amrReader
.
onReceivingFirstPacket
(
frame1
.
timestamp
,
frame1
.
sequenceNumber
);
packetData
.
reset
(
frame1
.
payloadData
);
amrReader
.
consume
(
packetData
,
frame1
.
timestamp
,
frame1
.
sequenceNumber
,
/* isFrameBoundary= */
frame1
.
marker
);
packetData
.
reset
(
frame2
.
payloadData
);
amrReader
.
consume
(
packetData
,
frame2
.
timestamp
,
frame2
.
sequenceNumber
,
/* isFrameBoundary= */
frame2
.
marker
);
assertThat
(
trackOutput
.
getSampleCount
()).
isEqualTo
(
2
);
assertThat
(
trackOutput
.
getSampleData
(
0
)).
isEqualTo
(
getBytesFromHexString
(
"870102030405060708090A0B0C0D0E0F1011"
));
assertThat
(
trackOutput
.
getSampleTimeUs
(
0
)).
isEqualTo
(
0
);
assertThat
(
trackOutput
.
getSampleData
(
1
)).
isEqualTo
(
getBytesFromHexString
(
"7E"
));
assertThat
(
trackOutput
.
getSampleTimeUs
(
1
)).
isEqualTo
(
96000
);
}
@Test
(
expected
=
IllegalArgumentException
.
class
)
public
void
consume_invalidFrameType_AMR_WB
()
{
RtpAmrReader
amrReader
=
createAmrReader
(
MimeTypes
.
AUDIO_AMR_WB
);
RtpPacket
frame1
=
createRtpPacket
(
/* timestamp= */
2599168056L
,
/* sequenceNumber= */
40289
,
/* payloadData= */
getBytesFromHexString
(
"00D501020304"
));
amrReader
.
createTracks
(
extractorOutput
,
/* trackId= */
0
);
amrReader
.
onReceivingFirstPacket
(
frame1
.
timestamp
,
frame1
.
sequenceNumber
);
packetData
.
reset
(
frame1
.
payloadData
);
amrReader
.
consume
(
packetData
,
frame1
.
timestamp
,
frame1
.
sequenceNumber
,
/* isFrameBoundary= */
frame1
.
marker
);
}
@Test
(
expected
=
IllegalArgumentException
.
class
)
public
void
consume_invalidFrameSize_AMR_WB
()
{
RtpAmrReader
amrReader
=
createAmrReader
(
MimeTypes
.
AUDIO_AMR_WB
);
RtpPacket
frame1
=
createRtpPacket
(
/* timestamp= */
2599168056L
,
/* sequenceNumber= */
40289
,
/* payloadData= */
getBytesFromHexString
(
"00A50102"
));
amrReader
.
createTracks
(
extractorOutput
,
/* trackId= */
0
);
amrReader
.
onReceivingFirstPacket
(
frame1
.
timestamp
,
frame1
.
sequenceNumber
);
packetData
.
reset
(
frame1
.
payloadData
);
amrReader
.
consume
(
packetData
,
frame1
.
timestamp
,
frame1
.
sequenceNumber
,
/* isFrameBoundary= */
frame1
.
marker
);
}
private
static
RtpPacket
createRtpPacket
(
long
timestamp
,
int
sequenceNumber
,
byte
[]
payloadData
)
{
return
new
RtpPacket
.
Builder
()
.
setTimestamp
((
int
)
timestamp
)
.
setSequenceNumber
(
sequenceNumber
)
.
setMarker
(
false
)
.
setPayloadData
(
payloadData
)
.
build
();
}
private
static
RtpAmrReader
createAmrReader
(
String
mimeType
)
{
switch
(
mimeType
)
{
case
MimeTypes
.
AUDIO_AMR
:
return
new
RtpAmrReader
(
createRtpPayloadFormat
(
mimeType
,
8000
));
case
MimeTypes
.
AUDIO_AMR_WB
:
return
new
RtpAmrReader
(
createRtpPayloadFormat
(
mimeType
,
16000
));
}
return
null
;
}
private
static
RtpPayloadFormat
createRtpPayloadFormat
(
String
mimeType
,
int
sampleRate
)
{
return
new
RtpPayloadFormat
(
new
Format
.
Builder
()
.
setChannelCount
(
1
)
.
setSampleMimeType
(
mimeType
)
.
setSampleRate
(
sampleRate
)
.
build
(),
/* rtpPayloadType= */
97
,
/* clockRate= */
sampleRate
,
/* fmtpParameters= */
ImmutableMap
.
of
());
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment