User Tools

Site Tools


tech:multimedia:iso_mp4_parser

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
tech:multimedia:iso_mp4_parser [2011/09/14 06:41]
admin
tech:multimedia:iso_mp4_parser [2011/12/29 07:19]
admin
Line 1: Line 1:
-<​code ​cpp>+<​code ​cplusplus>
 /*** /***
  ​* ​  ​* ​
Line 9: Line 9:
  *  *
 */ */
- +  
 + 
 #include <​iostream>​ #include <​iostream>​
 #include <​fstream>​ #include <​fstream>​
Line 603: Line 603:
    
         /* count chars */         /* count chars */
-        int len;+        int len = 0;
         int pos = in.tellg();         int pos = in.tellg();
         while(in.get()) len++;         while(in.get()) len++;
Line 628: Line 628:
     }     }
 }; };
 + 
 /* /*
  Video Media Header Box   Video Media Header Box 
Line 659: Line 659:
     }     }
 }; };
 + 
 /* /*
  Sound Media Header Box  Sound Media Header Box
Line 690: Line 690:
     }     }
 }; };
 + 
 /* /*
  Hint Media Header Box  Hint Media Header Box
  The hint media header contains general information,​ independent of the protocol, for hint tracks  The hint media header contains general information,​ independent of the protocol, for hint tracks
 */ */
 + 
 class CHintMediaHeaderBox : public CFullBox class CHintMediaHeaderBox : public CFullBox
 { {
Line 722: Line 722:
     }     }
 }; };
 + 
 /* /*
  Data Reference Box  Data Reference Box
Line 751: Line 751:
         if (!CFullBox::​Parse(in))         if (!CFullBox::​Parse(in))
             return false;             return false;
 + 
         unsigned char buf[4];         unsigned char buf[4];
         in.read((char *)buf, 4);         in.read((char *)buf, 4);
Line 764: Line 764:
             this->​entries[i] = CBox::​Create(CBox::​MakeInt(buf),​ this->​nested+1);​             this->​entries[i] = CBox::​Create(CBox::​MakeInt(buf),​ this->​nested+1);​
             in.seekg(pos,​ ios_base::​beg);​             in.seekg(pos,​ ios_base::​beg);​
-            ​+ 
             if (!this->​entries[i]->​Parse(in)) return false;             if (!this->​entries[i]->​Parse(in)) return false;
         }         }
-        ​+ 
         /* skip */         /* skip */
         in.seekg(this->​end,​ ios_base::​beg);​         in.seekg(this->​end,​ ios_base::​beg);​
Line 782: Line 782:
         out << this->​entry_count << " Entries";​         out << this->​entry_count << " Entries";​
         out << " }" << endl;         out << " }" << endl;
 + 
         for (int i = 0; i < this->​entry_count;​ i++)         for (int i = 0; i < this->​entry_count;​ i++)
             this->​entries[i]->​Dump(out);​             this->​entries[i]->​Dump(out);​
-        ​+ 
         return;         return;
     }     }
 }; };
 + 
 /* /*
  URL Reference Box  URL Reference Box
Line 819: Line 819:
     }     }
 }; };
 + 
 /* /*
  URN Reference Box  URN Reference Box
Line 849: Line 849:
     }     }
 }; };
 + 
 /* /*
   Movie Fragment Box   Movie Fragment Box
Line 868: Line 868:
     {     {
         char buf[4];         char buf[4];
-        ​+ 
         if (!CFullBox::​Parse(in)) return false;         if (!CFullBox::​Parse(in)) return false;
 + 
         in.read(buf,​ 4);         in.read(buf,​ 4);
         this->​seq = CBox::​MakeInt((unsigned char *)buf);         this->​seq = CBox::​MakeInt((unsigned char *)buf);
-        ​+ 
         in.seekg(this->​end,​ ios_base::​beg);​         in.seekg(this->​end,​ ios_base::​beg);​
         this->​parsed = true;         this->​parsed = true;
 + 
         return true;         return true;
     }     }
Line 882: Line 882:
     {     {
         CFullBox::​Dump(out);​         CFullBox::​Dump(out);​
 + 
         for (int i = 0; i < this->​nested;​ i++) out << "​\t";​         for (int i = 0; i < this->​nested;​ i++) out << "​\t";​
    
Line 888: Line 888:
         out << "​No."​ << this->​seq;​         out << "​No."​ << this->​seq;​
         out << " }" << endl;         out << " }" << endl;
-        ​+ 
         return;         return;
     }        }   
 }; };
 + 
 /* /*
   Track Fragment Header Box   Track Fragment Header Box
Line 911: Line 911:
     {     {
         char buf[4];         char buf[4];
-        ​+ 
         if (!CFullBox::​Parse(in)) return false;         if (!CFullBox::​Parse(in)) return false;
 + 
         in.read(buf,​ 4);         in.read(buf,​ 4);
         this->​track_ID = CBox::​MakeInt((unsigned char *)buf);         this->​track_ID = CBox::​MakeInt((unsigned char *)buf);
-        ​+ 
         in.seekg(this->​end,​ ios_base::​beg);​         in.seekg(this->​end,​ ios_base::​beg);​
         this->​parsed = true;         this->​parsed = true;
 + 
         return true;         return true;
     }     }
Line 925: Line 925:
     {     {
         CFullBox::​Dump(out);​         CFullBox::​Dump(out);​
 + 
         for (int i = 0; i < this->​nested;​ i++) out << "​\t";​         for (int i = 0; i < this->​nested;​ i++) out << "​\t";​
    
Line 931: Line 931:
         out << "Track ID:" << this->​track_ID;​         out << "Track ID:" << this->​track_ID;​
         out << " }" << endl;         out << " }" << endl;
-        ​+ 
         return;         return;
     }        }   
 }; };
- +  
 + 
 /* /*
  ​Sample Entry Box, abstrac box  ​Sample Entry Box, abstrac box
Line 947: Line 947:
     CSampleEntryBox(unsigned int type, int nest) : CBox(type, nest), data_ref_id(0) {}     CSampleEntryBox(unsigned int type, int nest) : CBox(type, nest), data_ref_id(0) {}
     virtual ~CSampleEntryBox() {}     virtual ~CSampleEntryBox() {}
 + 
     virtual bool Parse(ifstream &in)     virtual bool Parse(ifstream &in)
     {     {
Line 953: Line 953:
             return false;             return false;
         in.seekg(6, ios_base::​cur);​         in.seekg(6, ios_base::​cur);​
 + 
         unsigned char buf[2];         unsigned char buf[2];
         in.read((char *)buf, 2);         in.read((char *)buf, 2);
         this->​data_ref_id = (buf[0] << 16) | buf[1];         this->​data_ref_id = (buf[0] << 16) | buf[1];
 + 
         return true;         return true;
     }     }
 + 
     virtual void Dump(ostream &out)     virtual void Dump(ostream &out)
     {     {
Line 967: Line 967:
     }     }
 }; };
 + 
 /* /*
   Visual Sample Entry Box   Visual Sample Entry Box
Line 984: Line 984:
     }     }
     virtual ~CVisualSampleEntryBox() {}     virtual ~CVisualSampleEntryBox() {}
 + 
     virtual bool Parse(ifstream &in)     virtual bool Parse(ifstream &in)
     {     {
         if (!CSampleEntryBox::​Parse(in))         if (!CSampleEntryBox::​Parse(in))
             return false;             return false;
 + 
         unsigned char buf[4];         unsigned char buf[4];
         in.seekg(16,​ ios_base::​cur);​         in.seekg(16,​ ios_base::​cur);​
Line 1001: Line 1001:
         in.read((char *)buf, 2);         in.read((char *)buf, 2);
         this->​frame_count = (buf[0] << 8) | buf[1];         this->​frame_count = (buf[0] << 8) | buf[1];
 + 
         in.seekg(36,​ ios_base::​cur);​         in.seekg(36,​ ios_base::​cur);​
-        ​+ 
         return true;         return true;
     }     }
 + 
     virtual void Dump(ostream &out)     virtual void Dump(ostream &out)
     {     {
         CBox::​Dump(out);​         CBox::​Dump(out);​
 + 
         for (int i = 0; i < this->​nested;​ i++) out << "​\t";​         for (int i = 0; i < this->​nested;​ i++) out << "​\t";​
 + 
         out << "{ ";         out << "{ ";
         out << this->​width << "​x"​ << this->​height << ", " << this->​frame_count << " frames per sample.";​         out << this->​width << "​x"​ << this->​height << ", " << this->​frame_count << " frames per sample.";​
         out << " }" << endl;         out << " }" << endl;
-        ​+ 
         return;         return;
     }     }
 }; };
 + 
 /*  /* 
  AVC Configuration Box (14496-15) ​  AVC Configuration Box (14496-15) ​
Line 1070: Line 1070:
     {     {
         CBox::​Dump(out);​         CBox::​Dump(out);​
 + 
         for (int i = 0; i < this->​nested;​ i++) out << "​\t";​         for (int i = 0; i < this->​nested;​ i++) out << "​\t";​
 + 
         out << "{ ";         out << "{ ";
         out << "​Profile:​ " << this->​profile << ", Level: " << this->​level << ", size of NAL length: " << this->​lNAL;​         out << "​Profile:​ " << this->​profile << ", Level: " << this->​level << ", size of NAL length: " << this->​lNAL;​
Line 1080: Line 1080:
     }     }
 }; };
 + 
 /*  /* 
  AVC Sample Entry Box (14496-15) ​  AVC Sample Entry Box (14496-15) ​
Line 1103: Line 1103:
         if (!config.Parse(in))         if (!config.Parse(in))
             return false;             return false;
 + 
         /* skip */         /* skip */
         in.seekg(this->​end,​ ios_base::​beg);​         in.seekg(this->​end,​ ios_base::​beg);​
Line 1113: Line 1113:
     {     {
         CVisualSampleEntryBox::​Dump(out);​         CVisualSampleEntryBox::​Dump(out);​
 + 
         config.Dump(out);​         config.Dump(out);​
-        ​+ 
         return;         return;
     }     }
 }; };
 + 
 /* /*
   Audio Sample Entry Box   Audio Sample Entry Box
Line 1136: Line 1136:
     }     }
     virtual ~CAudioSampleEntryBox() {}     virtual ~CAudioSampleEntryBox() {}
 + 
     virtual bool Parse(ifstream &in)     virtual bool Parse(ifstream &in)
     {     {
         if (!CSampleEntryBox::​Parse(in))         if (!CSampleEntryBox::​Parse(in))
             return false;             return false;
 + 
         unsigned char buf[4];         unsigned char buf[4];
         in.seekg(8, ios_base::​cur);​         in.seekg(8, ios_base::​cur);​
Line 1151: Line 1151:
         in.read((char *)buf, 4);         in.read((char *)buf, 4);
         this->​samplerate= CBox::​MakeInt(buf);​         this->​samplerate= CBox::​MakeInt(buf);​
 + 
         in.seekg(this->​end,​ ios_base::​beg); ​               in.seekg(this->​end,​ ios_base::​beg); ​      
         this->​parsed = true;         this->​parsed = true;
 + 
         return true;         return true;
     }     }
 + 
     virtual void Dump(ostream &out)     virtual void Dump(ostream &out)
     {     {
         CBox::​Dump(out);​         CBox::​Dump(out);​
 + 
         for (int i = 0; i < this->​nested;​ i++) out << "​\t";​         for (int i = 0; i < this->​nested;​ i++) out << "​\t";​
 + 
         unsigned short r1 = this->​samplerate >> 16;         unsigned short r1 = this->​samplerate >> 16;
         out << "{ ";         out << "{ ";
         out << this->​channelcount << " channels, sample size: " << this->​samplesize << ", sample rate: " << r1;         out << this->​channelcount << " channels, sample size: " << this->​samplesize << ", sample rate: " << r1;
         out << " }" << endl;         out << " }" << endl;
-        ​+ 
         return;         return;
     }     }
 }; };
 + 
 /* /*
  ​Sample Description Box  ​Sample Description Box
Line 1197: Line 1197:
             delete [] this->​subboxes; ​                       delete [] this->​subboxes; ​          
         }         }
-            ​+ 
     }     }
    
Line 1204: Line 1204:
         if (!CFullBox::​Parse(in))         if (!CFullBox::​Parse(in))
             return false;             return false;
 + 
         unsigned char buf[4];         unsigned char buf[4];
         in.read((char *)buf, 4);         in.read((char *)buf, 4);
         this->​entry_count = CBox::​MakeInt(buf);​         this->​entry_count = CBox::​MakeInt(buf);​
         this->​subboxes = new CBox*[this->​entry_count];​         this->​subboxes = new CBox*[this->​entry_count];​
 + 
         /* poll subboxes */         /* poll subboxes */
         for (int i = 0; i < this->​entry_count;​ i++)         for (int i = 0; i < this->​entry_count;​ i++)
Line 1221: Line 1221:
                 return false;                 return false;
         }         }
-        ​+ 
         in.seekg(this->​end,​ ios_base::​beg);​         in.seekg(this->​end,​ ios_base::​beg);​
         this->​parsed = true;         this->​parsed = true;
Line 1232: Line 1232:
         for (int i = 0; i < this->​nested;​ i++) out << "​\t";​         for (int i = 0; i < this->​nested;​ i++) out << "​\t";​
         out << "{ " << this->​entry_count << " Entries }" << endl;         out << "{ " << this->​entry_count << " Entries }" << endl;
 + 
         for (int i = 0; i < this->​entry_count;​ i++)         for (int i = 0; i < this->​entry_count;​ i++)
             this->​subboxes[i]->​Dump(out);​             this->​subboxes[i]->​Dump(out);​
-        ​+ 
         return;         return;
     }     }
 }; };
 + 
 /* /*
  ​Decoding Time to Sample Box  ​Decoding Time to Sample Box
Line 1271: Line 1271:
         if (!CFullBox::​Parse(in))         if (!CFullBox::​Parse(in))
             return false;             return false;
 + 
         unsigned char buf[4];         unsigned char buf[4];
         in.read((char *)buf, 4);         in.read((char *)buf, 4);
Line 1284: Line 1284:
             this->​entries[i]->​sample_delta = CBox::​MakeInt(buf);​             this->​entries[i]->​sample_delta = CBox::​MakeInt(buf);​
         }         }
-        ​+ 
         /* skip */         /* skip */
         in.seekg(this->​end,​ ios_base::​beg);​         in.seekg(this->​end,​ ios_base::​beg);​
Line 1294: Line 1294:
     {     {
         int i;         int i;
-        ​+ 
         CFullBox::​Dump(out);​         CFullBox::​Dump(out);​
         for (i = 0; i < this->​nested;​ i++) out << "​\t";​         for (i = 0; i < this->​nested;​ i++) out << "​\t";​
Line 1311: Line 1311:
     }    ​     }    ​
 }; };
 + 
 /* /*
  Sync Sample Box  Sync Sample Box
Line 1333: Line 1333:
         if (!CFullBox::​Parse(in))         if (!CFullBox::​Parse(in))
             return false;             return false;
 + 
         unsigned char buf[4];         unsigned char buf[4];
         in.read((char *)buf, 4);         in.read((char *)buf, 4);
Line 1343: Line 1343:
             this->​entries[i] = CBox::​MakeInt(buf);​             this->​entries[i] = CBox::​MakeInt(buf);​
         }         }
 + 
         /* skip */         /* skip */
         in.seekg(this->​end,​ ios_base::​beg);​         in.seekg(this->​end,​ ios_base::​beg);​
         this->​parsed = true;         this->​parsed = true;
-        ​+ 
    
         return true;         return true;
Line 1354: Line 1354:
     {     {
         int i;         int i;
-        ​+ 
         CFullBox::​Dump(out);​         CFullBox::​Dump(out);​
         for (i = 0; i < this->​nested;​ i++) out << "​\t";​         for (i = 0; i < this->​nested;​ i++) out << "​\t";​
Line 1371: Line 1371:
     }    ​     }    ​
 }; };
 + 
 /* /*
  ​Independent and Disposable Samples Box  ​Independent and Disposable Samples Box
Line 1393: Line 1393:
         if (!CFullBox::​Parse(in))         if (!CFullBox::​Parse(in))
             return false;             return false;
 + 
         unsigned long long pos = in.tellg();         unsigned long long pos = in.tellg();
         this->​entry_count = this->​end - pos;         this->​entry_count = this->​end - pos;
         this->​entries = new unsigned char[this->​entry_count];​         this->​entries = new unsigned char[this->​entry_count];​
         for (int i = 0; i < this->​entry_count;​ i++) this->​entries[i] = in.get();         for (int i = 0; i < this->​entry_count;​ i++) this->​entries[i] = in.get();
-                ​+ 
         /* skip */         /* skip */
         in.seekg(this->​end,​ ios_base::​beg);​         in.seekg(this->​end,​ ios_base::​beg);​
Line 1408: Line 1408:
     {     {
         int i;         int i;
-        ​+ 
         CFullBox::​Dump(out);​         CFullBox::​Dump(out);​
         for (i = 0; i < this->​nested;​ i++) out << "​\t";​         for (i = 0; i < this->​nested;​ i++) out << "​\t";​
Line 1435: Line 1435:
     }    ​     }    ​
 }; };
 + 
 /* /*
  ​Sample to Chunk Box  ​Sample to Chunk Box
Line 1468: Line 1468:
         if (!CFullBox::​Parse(in))         if (!CFullBox::​Parse(in))
             return false;             return false;
 + 
         unsigned char buf[4];         unsigned char buf[4];
         in.read((char *)buf, 4);         in.read((char *)buf, 4);
Line 1483: Line 1483:
             this->​entries[i]->​sd_id = CBox::​MakeInt(buf); ​           ​             this->​entries[i]->​sd_id = CBox::​MakeInt(buf); ​           ​
         }         }
-        ​+ 
         /* skip */         /* skip */
         in.seekg(this->​end,​ ios_base::​beg);​         in.seekg(this->​end,​ ios_base::​beg);​
Line 1493: Line 1493:
     {     {
         int i;         int i;
-        ​+ 
         CFullBox::​Dump(out);​         CFullBox::​Dump(out);​
         for (i = 0; i < this->​nested;​ i++) out << "​\t";​         for (i = 0; i < this->​nested;​ i++) out << "​\t";​
Line 1512: Line 1512:
     }    ​     }    ​
 }; };
 + 
 /* /*
  ​Sample Size Box  ​Sample Size Box
Line 1539: Line 1539:
         if (!CFullBox::​Parse(in))         if (!CFullBox::​Parse(in))
             return false;             return false;
 + 
         unsigned char buf[4];         unsigned char buf[4];
         in.read((char *)buf, 4);         in.read((char *)buf, 4);
Line 1554: Line 1554:
             }             }
         }         }
-        ​+ 
         /* skip */         /* skip */
         in.seekg(this->​end,​ ios_base::​beg);​         in.seekg(this->​end,​ ios_base::​beg);​
Line 1565: Line 1565:
         int i;         int i;
         CFullBox::​Dump(out);​         CFullBox::​Dump(out);​
 + 
         for (i = 0; i < this->​nested;​ i++) out << "​\t";​         for (i = 0; i < this->​nested;​ i++) out << "​\t";​
         out << "{ ";         out << "{ ";
Line 1580: Line 1580:
             out << this->​sample_size;​             out << this->​sample_size;​
         out << " }" << endl;    ​         out << " }" << endl;    ​
-        ​+ 
         return;         return;
     }    ​     }    ​
 }; };
 + 
 /* /*
  Chunk Offset Box  Chunk Offset Box
Line 1607: Line 1607:
         if (!CFullBox::​Parse(in))         if (!CFullBox::​Parse(in))
             return false;             return false;
 + 
         unsigned char buf[4];         unsigned char buf[4];
         in.read((char *)buf, 4);         in.read((char *)buf, 4);
         this->​entry_count = CBox::​MakeInt(buf);​         this->​entry_count = CBox::​MakeInt(buf);​
         if (this->​entry_count) this->​entries = new unsigned int[this->​entry_count];​         if (this->​entry_count) this->​entries = new unsigned int[this->​entry_count];​
-        ​+ 
         for (int i = 0; i < this->​entry_count;​ i++)          for (int i = 0; i < this->​entry_count;​ i++) 
         {         {
Line 1618: Line 1618:
             this->​entries[i] = CBox::​MakeInt(buf);​             this->​entries[i] = CBox::​MakeInt(buf);​
         }         }
-        ​+ 
         /* skip */         /* skip */
         in.seekg(this->​end,​ ios_base::​beg);​         in.seekg(this->​end,​ ios_base::​beg);​
Line 1629: Line 1629:
         int i;         int i;
         CFullBox::​Dump(out);​         CFullBox::​Dump(out);​
 + 
         for (i = 0; i < this->​nested;​ i++) out << "​\t";​         for (i = 0; i < this->​nested;​ i++) out << "​\t";​
         out << "{ ";         out << "{ ";
Line 1642: Line 1642:
         }         }
         out << " }" << endl;    ​         out << " }" << endl;    ​
-        ​+ 
         return;         return;
     }    ​     }    ​
tech/multimedia/iso_mp4_parser.txt · Last modified: 2014/11/10 08:22 (external edit)