diff --git a/trunk/research/players/jwplayer6.html b/trunk/research/players/jwplayer6.html
index 6eb420f73..bf4609ca7 100755
--- a/trunk/research/players/jwplayer6.html
+++ b/trunk/research/players/jwplayer6.html
@@ -15,8 +15,14 @@
diff --git a/trunk/research/players/osmf.html b/trunk/research/players/osmf.html
index 77e59cb22..f69bcf393 100755
--- a/trunk/research/players/osmf.html
+++ b/trunk/research/players/osmf.html
@@ -14,50 +14,54 @@
}
@@ -176,6 +247,15 @@
diff --git a/trunk/research/players/srs_player/release/srs_player.swf b/trunk/research/players/srs_player/release/srs_player.swf
index d79fafd00..c3de2e90e 100755
Binary files a/trunk/research/players/srs_player/release/srs_player.swf and b/trunk/research/players/srs_player/release/srs_player.swf differ
diff --git a/trunk/research/players/srs_player/src/srs_player.as b/trunk/research/players/srs_player/src/srs_player.as
index a6ade0085..446be1987 100755
--- a/trunk/research/players/srs_player/src/srs_player.as
+++ b/trunk/research/players/srs_player/src/srs_player.as
@@ -15,14 +15,23 @@ package
public class srs_player extends Sprite
{
+ // user set id.
private var id:String = null;
+ // user set callback
private var on_player_ready:String = null;
+ private var on_player_metadata:String = null;
+ // play param url.
private var url:String = null;
+ // play param, user set width
+ private var w:int = 0;
+ // play param, user set height.
+ private var h:int = 0;
private var conn:NetConnection = null;
private var stream:NetStream = null;
private var video:Video = null;
+ private var metadata:Object = {};
public function srs_player()
{
@@ -51,6 +60,7 @@ package
this.id = flashvars.id;
this.on_player_ready = flashvars.on_player_ready;
+ this.on_player_metadata = flashvars.on_player_metadata;
flash.utils.setTimeout(this.onJsReady, 0);
}
@@ -66,6 +76,7 @@ package
flash.external.ExternalInterface.addCallback("__stop", this.js_call_stop);
flash.external.ExternalInterface.addCallback("__pause", this.js_call_pause);
flash.external.ExternalInterface.addCallback("__resume", this.js_call_resume);
+ flash.external.ExternalInterface.addCallback("__dar", this.js_call_dar);
var code:int = flash.external.ExternalInterface.call(this.on_player_ready, this.id);
if (code != 0) {
@@ -87,6 +98,37 @@ package
return 0;
}
+ /**
+ * to set the DAR, for example, DAR=16:9
+ * @param num, for example, 9.
+ * @param den, for example, 16.
+ */
+ public function js_call_dar(num:int, den:int):int {
+ if (this.video && num > 0 && den > 0 && this.video.width > 0) {
+ // set DAR.
+ if (num < den) {
+ // calc the height by DAR
+ var _height:int = this.video.width * num / den;
+
+ // height overflow, calc the width by DAR
+ if (_height > this.h) {
+ var _width:int = this.video.height * den / num;
+
+ this.video.width = _width;
+ this.video.height = this.h;
+ } else {
+ this.video.width = this.w;
+ this.video.height = _height;
+ }
+ }
+
+ // align center.
+ this.video.y = (this.h - this.video.height) / 2;
+ this.video.x = (this.w - this.video.width) / 2;
+ }
+ return 0;
+ }
+
public function js_call_stop():int {
if (this.stream) {
this.stream.close();
@@ -106,7 +148,14 @@ package
public function js_call_play(url:String, _width:int, _height:int, _buffer_time:Number):int {
this.url = url;
- trace("start to play url: " + this.url);
+ this.w = _width;
+ this.h = _height;
+ trace("start to play url: " + this.url + ", w=" + this.w + ", h=" + this.h);
+
+ // draw black bg.
+ this.graphics.beginFill(0x00, 1.0);
+ this.graphics.drawRect(0, 0, this.w, this.h);
+ this.graphics.endFill();
js_call_stop();
@@ -122,18 +171,13 @@ package
stream = new NetStream(conn);
stream.bufferTime = _buffer_time;
stream.client = {};
- stream.client.onMetaData = function(metadata:Object):void {
- var customItems:Array = [new ContextMenuItem("SrsPlayer")];
- if (metadata.hasOwnProperty("server")) {
- customItems.push(new ContextMenuItem("Server: " + metadata.server));
- }
- if (metadata.hasOwnProperty("contributor")) {
- customItems.push(new ContextMenuItem("Contributor: " + metadata.contributor));
- }
- contextMenu.customItems = customItems;
- };
+ stream.client.onMetaData = on_metadata;
stream.addEventListener(NetStatusEvent.NET_STATUS, function(evt:NetStatusEvent):void {
trace ("NetStream: code=" + evt.info.code);
+
+ if (evt.info.code == "NetStream.Video.DimensionChange") {
+ on_metadata(metadata);
+ }
});
stream.play(url.substr(url.lastIndexOf("/")));
@@ -148,5 +192,53 @@ package
return 0;
}
+
+ private function on_metadata(metadata:Object):void {
+ this.metadata = metadata;
+
+ // for context menu
+ var customItems:Array = [new ContextMenuItem("SrsPlayer")];
+ if (metadata.hasOwnProperty("server")) {
+ customItems.push(new ContextMenuItem("Server: " + metadata.server));
+ }
+ if (metadata.hasOwnProperty("contributor")) {
+ customItems.push(new ContextMenuItem("Contributor: " + metadata.contributor));
+ }
+ contextMenu.customItems = customItems;
+
+ // for js.
+ var obj:Object = {
+ width: video.width,
+ height: video.height,
+ server: 'srs',
+ contributor: 'winlin'
+ };
+
+ if (metadata.hasOwnProperty("width")) {
+ obj.width = metadata.width;
+ }
+ if (metadata.hasOwnProperty("height")) {
+ obj.height = metadata.height;
+ }
+
+ if (video.videoWidth > 0) {
+ obj.width = video.videoWidth;
+ }
+ if (video.videoHeight > 0) {
+ obj.height = video.videoHeight;
+ }
+
+ if (metadata.hasOwnProperty("server")) {
+ obj.server = metadata.server;
+ }
+ if (metadata.hasOwnProperty("contributor")) {
+ obj.contributor = metadata.contributor;
+ }
+
+ var code:int = flash.external.ExternalInterface.call(on_player_metadata, id, obj);
+ if (code != 0) {
+ throw new Error("callback on_player_metadata failed. code=" + code);
+ }
+ }
}
}
\ No newline at end of file