[libbluray-devel] playlist player: validate source/locator before changing internal state
hpi1
git at videolan.org
Sun Apr 17 21:42:00 CEST 2016
libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Sun Apr 17 22:19:29 2016 +0300| [b628ccd7f6f7173ff36fe288ef2cc018b297d8a1] | committer: hpi1
playlist player: validate source/locator before changing internal state
> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=b628ccd7f6f7173ff36fe288ef2cc018b297d8a1
---
.../videolan/media/content/playlist/Handler.java | 70 +++++++++++++++-----
1 file changed, 53 insertions(+), 17 deletions(-)
diff --git a/src/libbluray/bdj/java/org/videolan/media/content/playlist/Handler.java b/src/libbluray/bdj/java/org/videolan/media/content/playlist/Handler.java
index 5607d55..0e374de 100644
--- a/src/libbluray/bdj/java/org/videolan/media/content/playlist/Handler.java
+++ b/src/libbluray/bdj/java/org/videolan/media/content/playlist/Handler.java
@@ -69,18 +69,38 @@ public class Handler extends BDHandler {
}
public void setSource(DataSource source) throws IOException, IncompatibleSourceException {
+
+ /* validate source */
+ BDLocator newLocator;
+ try {
+ newLocator = new BDLocator(source.getLocator().toExternalForm());
+ } catch (org.davic.net.InvalidLocatorException e) {
+ logger.error("incompatible source: " + source);
+ throw new IncompatibleSourceException();
+ } catch (Exception e) {
+ logger.error("unexpected expection: " + e);
+ throw new IncompatibleSourceException();
+ }
+
+ if (!newLocator.isPlayListItem()) {
+ logger.error("not playlist: " + newLocator);
+ throw new IncompatibleSourceException();
+ }
+
+ /* get playlist info */
+ PlaylistInfo newPi = Libbluray.getPlaylistInfo(newLocator.getPlayListId());
+ if (newPi == null) {
+ logger.error("getPlaylistInfo failed for " + newLocator);
+ throw new IOException();
+ }
+
+ /* commit changes and prefetch */
synchronized (this) {
- try {
- sourceLocator = new BDLocator(source.getLocator().toExternalForm());
- currentLocator = null;
- } catch (org.davic.net.InvalidLocatorException e) {
- throw new IncompatibleSourceException();
- }
- if (!sourceLocator.isPlayListItem())
- throw new IncompatibleSourceException();
- pi = Libbluray.getPlaylistInfo(sourceLocator.getPlayListId());
- if (pi == null)
- throw new IOException();
+
+ sourceLocator = newLocator;
+ currentLocator = null;
+ pi = newPi;
+
baseMediaTime = 0;
if (state == Prefetched)
doPrefetch();
@@ -350,16 +370,32 @@ public class Handler extends BDHandler {
protected void selectPlayList(BDLocator locator)
throws InvalidPlayListException, InvalidLocatorException, ClockStartedError {
+
+ if (locator == null) {
+ logger.error("null locator");
+ throw new NullPointerException();
+ }
+ if (!locator.isPlayListItem()) {
+ logger.error("not playlist: " + locator);
+ throw new InvalidLocatorException(locator);
+ }
+
+ PlaylistInfo newPi = Libbluray.getPlaylistInfo(locator.getPlayListId());
+ if (newPi == null) {
+ logger.error("invalid playlist");
+ throw new InvalidPlayListException();
+ }
+
synchronized (this) {
- if (getState() == Started)
+ if (getState() == Started) {
+ logger.error("throw ClockStartedError");
throw new ClockStartedError();
- if (!locator.isPlayListItem())
- throw new InvalidLocatorException(locator);
- pi = Libbluray.getPlaylistInfo(locator.getPlayListId());
- if (pi == null)
- throw new InvalidPlayListException();
+ }
+
+ this.pi = newPi;
this.sourceLocator = locator;
this.currentLocator = null;
+
baseMediaTime = 0;
if (state == Prefetched)
doPrefetch();
More information about the libbluray-devel
mailing list