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
9d88db71
authored
Jan 29, 2022
by
Dustin
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Clean up BitmapFactoryVideoRenderer
parent
b520b26f
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
53 additions
and
42 deletions
library/core/src/main/java/com/google/android/exoplayer2/video/BitmapFactoryVideoRenderer.java
library/core/src/main/java/com/google/android/exoplayer2/video/BitmapFactoryVideoRenderer.java
View file @
9d88db71
...
...
@@ -24,17 +24,22 @@ import java.nio.ByteBuffer;
public
class
BitmapFactoryVideoRenderer
extends
BaseRenderer
{
private
static
final
String
TAG
=
"BitmapFactoryRenderer"
;
final
VideoRendererEventListener
.
EventDispatcher
eventDispatcher
;
@Nullable
volatile
Surface
surface
;
private
static
int
threadId
;
private
final
Rect
rect
=
new
Rect
();
private
final
Point
lastSurface
=
new
Point
();
private
final
RenderRunnable
renderRunnable
=
new
RenderRunnable
();
private
final
Thread
thread
=
new
Thread
(
renderRunnable
,
"BitmapFactoryVideoRenderer"
);
final
VideoRendererEventListener
.
EventDispatcher
eventDispatcher
;
final
Thread
thread
=
new
Thread
(
renderRunnable
,
getClass
().
getSimpleName
()
+
threadId
++);
@Nullable
volatile
Surface
surface
;
private
VideoSize
lastVideoSize
=
VideoSize
.
UNKNOWN
;
private
long
currentTimeUs
;
private
long
frameUs
;
boolean
end
ed
;
private
boolean
firstFrameRender
ed
;
@Nullable
private
DecoderCounters
decoderCounters
;
...
...
@@ -60,8 +65,7 @@ public class BitmapFactoryVideoRenderer extends BaseRenderer {
@Override
protected
void
onDisabled
()
{
renderRunnable
.
running
=
false
;
thread
.
interrupt
();
renderRunnable
.
stop
();
@Nullable
final
DecoderCounters
decoderCounters
=
this
.
decoderCounters
;
...
...
@@ -111,7 +115,7 @@ public class BitmapFactoryVideoRenderer extends BaseRenderer {
@Override
public
boolean
isEnded
()
{
return
renderRunnable
.
ended
;
return
renderRunnable
.
isEnded
()
;
}
@Override
...
...
@@ -123,32 +127,9 @@ public class BitmapFactoryVideoRenderer extends BaseRenderer {
return
RendererCapabilities
.
create
(
C
.
FORMAT_UNSUPPORTED_TYPE
);
}
class
RenderRunnable
implements
Runnable
{
private
volatile
boolean
ended
;
private
boolean
firstFrameRendered
;
private
volatile
boolean
running
=
true
;
void
renderBitmap
(
final
Bitmap
bitmap
)
{
@Nullable
private
Bitmap
decodeInputBuffer
(
final
DecoderInputBuffer
decoderInputBuffer
)
{
@Nullable
final
ByteBuffer
byteBuffer
=
decoderInputBuffer
.
data
;
if
(
byteBuffer
!=
null
)
{
final
Bitmap
bitmap
;
try
{
bitmap
=
BitmapFactory
.
decodeByteArray
(
byteBuffer
.
array
(),
byteBuffer
.
arrayOffset
(),
byteBuffer
.
arrayOffset
()
+
byteBuffer
.
position
());
if
(
bitmap
==
null
)
{
eventDispatcher
.
videoCodecError
(
new
NullPointerException
(
"Decode bytes failed"
));
}
else
{
return
bitmap
;
}
}
catch
(
Exception
e
)
{
eventDispatcher
.
videoCodecError
(
e
);
}
}
return
null
;
}
private
void
renderBitmap
(
final
Bitmap
bitmap
,
@Nullable
final
Surface
surface
)
{
final
Surface
surface
=
this
.
surface
;
if
(
surface
==
null
)
{
return
;
}
...
...
@@ -192,6 +173,41 @@ public class BitmapFactoryVideoRenderer extends BaseRenderer {
}
}
class
RenderRunnable
implements
Runnable
{
final
DecoderInputBuffer
decoderInputBuffer
=
new
DecoderInputBuffer
(
DecoderInputBuffer
.
BUFFER_REPLACEMENT_MODE_NORMAL
);
private
volatile
boolean
running
=
true
;
void
stop
()
{
running
=
false
;
thread
.
interrupt
();
}
boolean
isEnded
()
{
return
!
running
||
decoderInputBuffer
.
isEndOfStream
();
}
@Nullable
private
Bitmap
decodeInputBuffer
(
final
DecoderInputBuffer
decoderInputBuffer
)
{
@Nullable
final
ByteBuffer
byteBuffer
=
decoderInputBuffer
.
data
;
if
(
byteBuffer
!=
null
)
{
final
Bitmap
bitmap
;
try
{
bitmap
=
BitmapFactory
.
decodeByteArray
(
byteBuffer
.
array
(),
byteBuffer
.
arrayOffset
(),
byteBuffer
.
arrayOffset
()
+
byteBuffer
.
position
());
if
(
bitmap
==
null
)
{
eventDispatcher
.
videoCodecError
(
new
NullPointerException
(
"Decode bytes failed"
));
}
else
{
return
bitmap
;
}
}
catch
(
Exception
e
)
{
eventDispatcher
.
videoCodecError
(
e
);
}
}
return
null
;
}
/**
*
* @return true if interrupted
...
...
@@ -210,9 +226,6 @@ public class BitmapFactoryVideoRenderer extends BaseRenderer {
public
void
run
()
{
final
FormatHolder
formatHolder
=
getFormatHolder
();
@NonNull
final
DecoderInputBuffer
decoderInputBuffer
=
new
DecoderInputBuffer
(
DecoderInputBuffer
.
BUFFER_REPLACEMENT_MODE_NORMAL
);
long
start
=
SystemClock
.
uptimeMillis
();
main:
while
(
running
)
{
...
...
@@ -221,10 +234,8 @@ public class BitmapFactoryVideoRenderer extends BaseRenderer {
formatHolder
.
format
==
null
?
SampleStream
.
FLAG_REQUIRE_FORMAT
:
0
);
if
(
result
==
C
.
RESULT_BUFFER_READ
)
{
if
(
decoderInputBuffer
.
isEndOfStream
())
{
ended
=
true
;
if
(!
sleep
())
{
ended
=
false
;
}
//Wait for shutdown or stream to be changed
sleep
();
continue
;
}
final
long
leadUs
=
decoderInputBuffer
.
timeUs
-
currentTimeUs
;
...
...
@@ -244,17 +255,17 @@ public class BitmapFactoryVideoRenderer extends BaseRenderer {
while
(
currentTimeUs
<
decoderInputBuffer
.
timeUs
)
{
//Log.d(TAG, "Sleep: us=" + currentTimeUs);
if
(
sleep
())
{
//Sleep was interrupted, discard Bitmap
continue
main
;
}
}
if
(
running
)
{
renderBitmap
(
bitmap
,
surface
);
renderBitmap
(
bitmap
);
}
}
else
if
(
result
==
C
.
RESULT_FORMAT_READ
)
{
onFormatChanged
(
formatHolder
);
}
}
ended
=
true
;
}
}
}
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