From c6407b3aa1bd6fbc8d7f437a76e844eca6466432 Mon Sep 17 00:00:00 2001
From: Thulinma <jaron@vietors.com>
Date: Fri, 31 Aug 2012 10:38:53 +0200
Subject: [PATCH] Made FLV metadata more like most FLV files.

---
 lib/flv_tag.cpp | 49 +++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 39 insertions(+), 10 deletions(-)

diff --git a/lib/flv_tag.cpp b/lib/flv_tag.cpp
index 3761c7b2..a025563b 100644
--- a/lib/flv_tag.cpp
+++ b/lib/flv_tag.cpp
@@ -452,11 +452,12 @@ bool FLV::Tag::DTSCMetaInit(DTSC::Stream & S){
   amfdata.addContent(AMF::Object("", AMF::AMF0_ECMA_ARRAY));
   if (S.metadata.isMember("length")){
     amfdata.getContentP(1)->addContent(AMF::Object("duration", S.metadata["length"].asInt(), AMF::AMF0_NUMBER));
+    amfdata.getContentP(1)->addContent(AMF::Object("moovPosition", 40, AMF::AMF0_NUMBER));
   }
   if (S.metadata.isMember("video")){
     amfdata.getContentP(1)->addContent(AMF::Object("hasVideo", 1, AMF::AMF0_BOOL));
     if (S.metadata["video"]["codec"].asString() == "H264"){
-      amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 7, AMF::AMF0_NUMBER));
+      amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", (std::string)"avc1"));
     }
     if (S.metadata["video"]["codec"].asString() == "VP6"){
       amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 4, AMF::AMF0_NUMBER));
@@ -471,7 +472,7 @@ bool FLV::Tag::DTSCMetaInit(DTSC::Stream & S){
       amfdata.getContentP(1)->addContent(AMF::Object("height", S.metadata["video"]["height"].asInt(), AMF::AMF0_NUMBER));
     }
     if (S.metadata["video"].isMember("fpks")){
-      amfdata.getContentP(1)->addContent(AMF::Object("framerate", (double)S.metadata["video"]["fpks"].asInt() / 1000.0, AMF::AMF0_NUMBER));
+      amfdata.getContentP(1)->addContent(AMF::Object("videoframerate", (double)S.metadata["video"]["fpks"].asInt() / 1000.0, AMF::AMF0_NUMBER));
     }
     if (S.metadata["video"].isMember("bps")){
       amfdata.getContentP(1)->addContent(AMF::Object("videodatarate", ((double)S.metadata["video"]["bps"].asInt() * 8.0) / 1024.0, AMF::AMF0_NUMBER));
@@ -481,17 +482,13 @@ bool FLV::Tag::DTSCMetaInit(DTSC::Stream & S){
     amfdata.getContentP(1)->addContent(AMF::Object("hasAudio", 1, AMF::AMF0_BOOL));
     amfdata.getContentP(1)->addContent(AMF::Object("audiodelay", 0, AMF::AMF0_NUMBER));
     if (S.metadata["audio"]["codec"].asString() == "AAC"){
-      amfdata.getContentP(1)->addContent(AMF::Object("audiocodecid", 10, AMF::AMF0_NUMBER));
+      amfdata.getContentP(1)->addContent(AMF::Object("audiocodecid", (std::string)"mp4a"));
     }
     if (S.metadata["audio"]["codec"].asString() == "MP3"){
-      amfdata.getContentP(1)->addContent(AMF::Object("audiocodecid", 2, AMF::AMF0_NUMBER));
+      amfdata.getContentP(1)->addContent(AMF::Object("audiocodecid", (std::string)"mp3"));
     }
     if (S.metadata["audio"].isMember("channels")){
-      if (S.metadata["audio"]["channels"].asInt() > 1){
-        amfdata.getContentP(1)->addContent(AMF::Object("stereo", 1, AMF::AMF0_BOOL));
-      }else{
-        amfdata.getContentP(1)->addContent(AMF::Object("stereo", 0, AMF::AMF0_BOOL));
-      }
+      amfdata.getContentP(1)->addContent(AMF::Object("audiochannels", S.metadata["audio"]["channels"].asInt(), AMF::AMF0_NUMBER));
     }
     if (S.metadata["audio"].isMember("rate")){
       amfdata.getContentP(1)->addContent(AMF::Object("audiosamplerate", S.metadata["audio"]["rate"].asInt(), AMF::AMF0_NUMBER));
@@ -503,7 +500,39 @@ bool FLV::Tag::DTSCMetaInit(DTSC::Stream & S){
       amfdata.getContentP(1)->addContent(AMF::Object("audiodatarate", ((double)S.metadata["audio"]["bps"].asInt() * 8.0) / 1024.0, AMF::AMF0_NUMBER));
     }
   }
-  
+  AMF::Object trinfo = AMF::Object("trackinfo", AMF::AMF0_STRICT_ARRAY);
+  int i = 0;
+  if (S.metadata.isMember("audio")){
+    trinfo.addContent(AMF::Object("", AMF::AMF0_OBJECT));
+    trinfo.getContentP(i)->addContent(AMF::Object("length", ((double)S.metadata["length"].asInt()) * ((double)S.metadata["audio"]["rate"].asInt()), AMF::AMF0_NUMBER));
+    trinfo.getContentP(i)->addContent(AMF::Object("timescale", S.metadata["audio"]["rate"].asInt(), AMF::AMF0_NUMBER));
+    trinfo.getContentP(i)->addContent(AMF::Object("sampledescription", AMF::AMF0_STRICT_ARRAY));
+    if (S.metadata["audio"]["codec"].asString() == "AAC"){
+      trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", (std::string)"mp4a"));
+    }
+    if (S.metadata["audio"]["codec"].asString() == "MP3"){
+      trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", (std::string)"mp3"));
+    }
+    ++i;
+  }
+  if (S.metadata.isMember("video")){
+    trinfo.addContent(AMF::Object("", AMF::AMF0_OBJECT));
+    trinfo.getContentP(i)->addContent(AMF::Object("length", ((double)S.metadata["length"].asInt()) * ((double)S.metadata["video"]["fkps"].asInt() / 1000.0), AMF::AMF0_NUMBER));
+    trinfo.getContentP(i)->addContent(AMF::Object("timescale", ((double)S.metadata["video"]["fkps"].asInt() / 1000.0), AMF::AMF0_NUMBER));
+    trinfo.getContentP(i)->addContent(AMF::Object("sampledescription", AMF::AMF0_STRICT_ARRAY));
+    if (S.metadata["video"]["codec"].asString() == "H264"){
+      trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", (std::string)"avc1"));
+    }
+    if (S.metadata["video"]["codec"].asString() == "VP6"){
+      trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", (std::string)"vp6"));
+    }
+    if (S.metadata["video"]["codec"].asString() == "H263"){
+      trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", (std::string)"h263"));
+    }
+    ++i;
+  }
+  amfdata.getContentP(1)->addContent(trinfo);
+
   std::string tmp = amfdata.Pack();
   len = tmp.length() + 15;
   if (len > 0){