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
da47771d
authored
Jul 05, 2022
by
Manisha Jajoo
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Add test for Rtp H263 Reader
Change-Id: I57d57881ef5c158d41be1bf1e3714332d50cd3a9
parent
a38059d1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
198 additions
and
0 deletions
libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/reader/RtpH263ReaderTest.java
libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/reader/RtpH263ReaderTest.java
0 → 100644
View file @
da47771d
/*
* 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
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.test.utils.FakeExtractorOutput
;
import
androidx.media3.test.utils.FakeTrackOutput
;
import
androidx.test.ext.junit.runners.AndroidJUnit4
;
import
com.google.common.collect.ImmutableMap
;
import
com.google.common.primitives.Bytes
;
import
org.junit.Before
;
import
org.junit.Rule
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.mockito.junit.MockitoJUnit
;
import
org.mockito.junit.MockitoRule
;
/**
* Unit test for {@link RtpH263Reader}.
*/
@RunWith
(
AndroidJUnit4
.
class
)
public
final
class
RtpH263ReaderTest
{
private
static
final
byte
[]
FRAME_1_FRAGMENT_1_DATA
=
getBytesFromHexString
(
"80020c0419b7b7d9591f03023e0c37b"
);
private
final
RtpPacket
FRAME_1_FRAGMENT_1
=
new
RtpPacket
.
Builder
()
.
setTimestamp
((
int
)
2599168056L
)
.
setSequenceNumber
(
40289
)
.
setMarker
(
false
)
.
setPayloadData
(
Bytes
.
concat
(
/*payload header */
getBytesFromHexString
(
"0400"
),
FRAME_1_FRAGMENT_1_DATA
))
.
build
();
private
static
final
byte
[]
FRAME_1_FRAGMENT_2_DATA
=
getBytesFromHexString
(
"03140e0e77d5e83021a0c37"
);
private
static
final
RtpPacket
FRAME_1_FRAGMENT_2
=
new
RtpPacket
.
Builder
()
.
setTimestamp
((
int
)
2599168056L
)
.
setSequenceNumber
(
40290
)
.
setMarker
(
true
)
.
setPayloadData
(
Bytes
.
concat
(
/*payload header */
getBytesFromHexString
(
"0000"
),
FRAME_1_FRAGMENT_2_DATA
))
.
build
();
private
static
final
byte
[]
FRAME_1_DATA
=
Bytes
.
concat
(
getBytesFromHexString
(
"0000"
),
FRAME_1_FRAGMENT_1_DATA
,
FRAME_1_FRAGMENT_2_DATA
);
private
static
final
byte
[]
FRAME_2_FRAGMENT_1_DATA
=
getBytesFromHexString
(
"800a0e023ffffffffffffffffff"
);
private
final
RtpPacket
FRAME_2_FRAGMENT_1
=
new
RtpPacket
.
Builder
()
.
setTimestamp
((
int
)
2599168344L
)
.
setSequenceNumber
(
40291
)
.
setMarker
(
false
)
.
setPayloadData
(
Bytes
.
concat
(
/*payload header */
getBytesFromHexString
(
"0400"
),
FRAME_2_FRAGMENT_1_DATA
))
.
build
();
private
static
final
byte
[]
FRAME_2_FRAGMENT_2_DATA
=
getBytesFromHexString
(
"830df80c501839dfccdbdbecac"
);
private
static
final
RtpPacket
FRAME_2_FRAGMENT_2
=
new
RtpPacket
.
Builder
()
.
setTimestamp
((
int
)
2599168344L
)
.
setSequenceNumber
(
40292
)
.
setMarker
(
true
)
.
setPayloadData
(
Bytes
.
concat
(
/*payload header */
getBytesFromHexString
(
"0000"
),
FRAME_2_FRAGMENT_2_DATA
))
.
build
();
private
static
final
byte
[]
FRAME_2_DATA
=
Bytes
.
concat
(
getBytesFromHexString
(
"0000"
),
FRAME_2_FRAGMENT_1_DATA
,
FRAME_2_FRAGMENT_2_DATA
);
private
static
final
RtpPayloadFormat
H263_FORMAT
=
new
RtpPayloadFormat
(
new
Format
.
Builder
()
.
setSampleMimeType
(
MimeTypes
.
VIDEO_H263
)
.
setWidth
(
352
)
.
setHeight
(
288
)
.
build
(),
/* rtpPayloadType= */
96
,
/* clockRate= */
90_000
,
/* fmtpParameters= */
ImmutableMap
.
of
());
@Rule
public
final
MockitoRule
mockito
=
MockitoJUnit
.
rule
();
private
FakeTrackOutput
trackOutput
;
private
FakeExtractorOutput
extractorOutput
;
@Before
public
void
setUp
()
{
extractorOutput
=
new
FakeExtractorOutput
();
}
@Test
public
void
consume_validPackets
()
{
RtpH263Reader
h263Reader
=
new
RtpH263Reader
(
H263_FORMAT
);
h263Reader
.
createTracks
(
extractorOutput
,
/* trackId= */
0
);
h263Reader
.
onReceivingFirstPacket
(
FRAME_1_FRAGMENT_1
.
timestamp
,
FRAME_1_FRAGMENT_1
.
sequenceNumber
);
consume
(
h263Reader
,
FRAME_1_FRAGMENT_1
);
consume
(
h263Reader
,
FRAME_1_FRAGMENT_2
);
consume
(
h263Reader
,
FRAME_2_FRAGMENT_1
);
consume
(
h263Reader
,
FRAME_2_FRAGMENT_2
);
trackOutput
=
extractorOutput
.
trackOutputs
.
get
(
0
);
assertThat
(
trackOutput
.
getSampleCount
()).
isEqualTo
(
2
);
assertThat
(
trackOutput
.
getSampleData
(
0
)).
isEqualTo
(
FRAME_1_DATA
);
assertThat
(
trackOutput
.
getSampleTimeUs
(
0
)).
isEqualTo
(
0
);
assertThat
(
trackOutput
.
getSampleData
(
1
)).
isEqualTo
(
FRAME_2_DATA
);
assertThat
(
trackOutput
.
getSampleTimeUs
(
1
)).
isEqualTo
(
3200
);
}
@Test
public
void
consume_fragmentedFrameMissingFirstFragment
()
{
RtpH263Reader
h263Reader
=
new
RtpH263Reader
(
H263_FORMAT
);
h263Reader
.
createTracks
(
extractorOutput
,
/* trackId= */
0
);
h263Reader
.
onReceivingFirstPacket
(
FRAME_1_FRAGMENT_1
.
timestamp
,
FRAME_1_FRAGMENT_1
.
sequenceNumber
);
consume
(
h263Reader
,
FRAME_1_FRAGMENT_2
);
consume
(
h263Reader
,
FRAME_2_FRAGMENT_1
);
consume
(
h263Reader
,
FRAME_2_FRAGMENT_2
);
trackOutput
=
extractorOutput
.
trackOutputs
.
get
(
0
);
assertThat
(
trackOutput
.
getSampleCount
()).
isEqualTo
(
1
);
assertThat
(
trackOutput
.
getSampleData
(
0
)).
isEqualTo
(
FRAME_2_DATA
);
assertThat
(
trackOutput
.
getSampleTimeUs
(
0
)).
isEqualTo
(
3200
);
}
@Test
public
void
consume_fragmentedFrameMissingBoundaryFragment
()
{
RtpH263Reader
h263Reader
=
new
RtpH263Reader
(
H263_FORMAT
);
h263Reader
.
createTracks
(
extractorOutput
,
/* trackId= */
0
);
h263Reader
.
onReceivingFirstPacket
(
FRAME_1_FRAGMENT_1
.
timestamp
,
FRAME_1_FRAGMENT_1
.
sequenceNumber
);
consume
(
h263Reader
,
FRAME_1_FRAGMENT_1
);
consume
(
h263Reader
,
FRAME_2_FRAGMENT_1
);
consume
(
h263Reader
,
FRAME_2_FRAGMENT_2
);
trackOutput
=
extractorOutput
.
trackOutputs
.
get
(
0
);
assertThat
(
trackOutput
.
getSampleCount
()).
isEqualTo
(
2
);
assertThat
(
trackOutput
.
getSampleData
(
0
))
.
isEqualTo
(
Bytes
.
concat
(
getBytesFromHexString
(
"0000"
),
FRAME_1_FRAGMENT_1_DATA
));
assertThat
(
trackOutput
.
getSampleTimeUs
(
0
)).
isEqualTo
(
0
);
assertThat
(
trackOutput
.
getSampleData
(
1
)).
isEqualTo
(
FRAME_2_DATA
);
assertThat
(
trackOutput
.
getSampleTimeUs
(
1
)).
isEqualTo
(
3200
);
}
@Test
public
void
consume_outOfOrderPackets
()
{
RtpH263Reader
h263Reader
=
new
RtpH263Reader
(
H263_FORMAT
);
h263Reader
.
createTracks
(
extractorOutput
,
/* trackId= */
0
);
h263Reader
.
onReceivingFirstPacket
(
FRAME_1_FRAGMENT_1
.
timestamp
,
FRAME_1_FRAGMENT_1
.
sequenceNumber
);
consume
(
h263Reader
,
FRAME_1_FRAGMENT_1
);
consume
(
h263Reader
,
FRAME_2_FRAGMENT_1
);
consume
(
h263Reader
,
FRAME_1_FRAGMENT_1
);
consume
(
h263Reader
,
FRAME_2_FRAGMENT_2
);
trackOutput
=
extractorOutput
.
trackOutputs
.
get
(
0
);
assertThat
(
trackOutput
.
getSampleCount
()).
isEqualTo
(
2
);
assertThat
(
trackOutput
.
getSampleData
(
0
))
.
isEqualTo
(
Bytes
.
concat
(
getBytesFromHexString
(
"0000"
),
FRAME_1_FRAGMENT_1_DATA
));
assertThat
(
trackOutput
.
getSampleTimeUs
(
0
)).
isEqualTo
(
0
);
assertThat
(
trackOutput
.
getSampleData
(
1
)).
isEqualTo
(
FRAME_2_DATA
);
assertThat
(
trackOutput
.
getSampleTimeUs
(
1
)).
isEqualTo
(
3200
);
}
private
static
void
consume
(
RtpH263Reader
h263Reader
,
RtpPacket
rtpPacket
)
{
ParsableByteArray
packetData
=
new
ParsableByteArray
();
packetData
.
reset
(
rtpPacket
.
payloadData
);
h263Reader
.
consume
(
packetData
,
rtpPacket
.
timestamp
,
rtpPacket
.
sequenceNumber
,
/* isFrameBoundary= */
rtpPacket
.
marker
);
}
}
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