winlin

for #738, parse mp4 udta(user data) box.

@@ -189,6 +189,7 @@ int SrsMp4Box::discovery(SrsBuffer* buf, SrsMp4Box** ppbox) @@ -189,6 +189,7 @@ int SrsMp4Box::discovery(SrsBuffer* buf, SrsMp4Box** ppbox)
189 case SrsMp4BoxTypeAVCC: box = new SrsMp4AvccBox(); break; 189 case SrsMp4BoxTypeAVCC: box = new SrsMp4AvccBox(); break;
190 case SrsMp4BoxTypeMP4A: box = new SrsMp4AudioSampleEntry(); break; 190 case SrsMp4BoxTypeMP4A: box = new SrsMp4AudioSampleEntry(); break;
191 case SrsMp4BoxTypeESDS: box = new SrsMp4EsdsBox(); break; 191 case SrsMp4BoxTypeESDS: box = new SrsMp4EsdsBox(); break;
  192 + case SrsMp4BoxTypeUDTA: box = new SrsMp4UserDataBox(); break;
192 default: 193 default:
193 ret = ERROR_MP4_BOX_ILLEGAL_TYPE; 194 ret = ERROR_MP4_BOX_ILLEGAL_TYPE;
194 srs_error("MP4 illegal box type=%d. ret=%d", type, ret); 195 srs_error("MP4 illegal box type=%d. ret=%d", type, ret);
@@ -624,6 +625,21 @@ SrsMp4MovieBox::~SrsMp4MovieBox() @@ -624,6 +625,21 @@ SrsMp4MovieBox::~SrsMp4MovieBox()
624 { 625 {
625 } 626 }
626 627
  628 +int SrsMp4MovieBox::nb_header()
  629 +{
  630 + return SrsMp4Box::nb_header();
  631 +}
  632 +
  633 +int SrsMp4MovieBox::encode_header(SrsBuffer* buf)
  634 +{
  635 + return SrsMp4Box::encode_header(buf);
  636 +}
  637 +
  638 +int SrsMp4MovieBox::decode_header(SrsBuffer* buf)
  639 +{
  640 + return SrsMp4Box::decode_header(buf);
  641 +}
  642 +
627 SrsMp4MovieHeaderBox::SrsMp4MovieHeaderBox() 643 SrsMp4MovieHeaderBox::SrsMp4MovieHeaderBox()
628 { 644 {
629 type = SrsMp4BoxTypeMVHD; 645 type = SrsMp4BoxTypeMVHD;
@@ -2621,6 +2637,55 @@ int SrsMp4SampleSizeBox::decode_header(SrsBuffer* buf) @@ -2621,6 +2637,55 @@ int SrsMp4SampleSizeBox::decode_header(SrsBuffer* buf)
2621 return ret; 2637 return ret;
2622 } 2638 }
2623 2639
  2640 +SrsMp4UserDataBox::SrsMp4UserDataBox()
  2641 +{
  2642 + type = SrsMp4BoxTypeUDTA;
  2643 + nb_data = 0;
  2644 + data = NULL;
  2645 +}
  2646 +
  2647 +SrsMp4UserDataBox::~SrsMp4UserDataBox()
  2648 +{
  2649 + srs_freepa(data);
  2650 +}
  2651 +
  2652 +int SrsMp4UserDataBox::nb_header()
  2653 +{
  2654 + return SrsMp4Box::nb_header()+nb_data;
  2655 +}
  2656 +
  2657 +int SrsMp4UserDataBox::encode_header(SrsBuffer* buf)
  2658 +{
  2659 + int ret = ERROR_SUCCESS;
  2660 +
  2661 + if ((ret = SrsMp4Box::encode_header(buf)) != ERROR_SUCCESS) {
  2662 + return ret;
  2663 + }
  2664 +
  2665 + if (nb_data) {
  2666 + buf->write_bytes((char*)data, nb_data);
  2667 + }
  2668 +
  2669 + return ret;
  2670 +}
  2671 +
  2672 +int SrsMp4UserDataBox::decode_header(SrsBuffer* buf)
  2673 +{
  2674 + int ret = ERROR_SUCCESS;
  2675 +
  2676 + if ((ret = SrsMp4Box::decode_header(buf)) != ERROR_SUCCESS) {
  2677 + return ret;
  2678 + }
  2679 +
  2680 + nb_data = left_space(buf);
  2681 + if (nb_data) {
  2682 + data = new uint8_t[nb_data];
  2683 + buf->read_bytes((char*)data, nb_data);
  2684 + }
  2685 +
  2686 + return ret;
  2687 +}
  2688 +
2624 #define SRS_MP4_BUF_SIZE 4096 2689 #define SRS_MP4_BUF_SIZE 4096
2625 2690
2626 SrsMp4Decoder::SrsMp4Decoder() 2691 SrsMp4Decoder::SrsMp4Decoder()
@@ -2693,6 +2758,14 @@ int SrsMp4Decoder::initialize(ISrsReader* r) @@ -2693,6 +2758,14 @@ int SrsMp4Decoder::initialize(ISrsReader* r)
2693 return ret; 2758 return ret;
2694 } 2759 }
2695 2760
  2761 + // Parse the MOOV.
  2762 + SrsMp4MovieBox* moov = dynamic_cast<SrsMp4MovieBox*>(box);
  2763 + return parse_moov(moov);
  2764 +}
  2765 +
  2766 +int SrsMp4Decoder::parse_moov(SrsMp4MovieBox* moov)
  2767 +{
  2768 + int ret = ERROR_SUCCESS;
2696 return ret; 2769 return ret;
2697 } 2770 }
2698 2771
@@ -80,6 +80,7 @@ enum SrsMp4BoxType @@ -80,6 +80,7 @@ enum SrsMp4BoxType
80 SrsMp4BoxTypeAVCC = 0x61766343, // 'avcC' 80 SrsMp4BoxTypeAVCC = 0x61766343, // 'avcC'
81 SrsMp4BoxTypeMP4A = 0x6d703461, // 'mp4a' 81 SrsMp4BoxTypeMP4A = 0x6d703461, // 'mp4a'
82 SrsMp4BoxTypeESDS = 0x65736473, // 'esds' 82 SrsMp4BoxTypeESDS = 0x65736473, // 'esds'
  83 + SrsMp4BoxTypeUDTA = 0x75647461, // 'udta'
83 84
84 SrsMp4BoxTypeVIDE = 0x76696465, // 'vide' 85 SrsMp4BoxTypeVIDE = 0x76696465, // 'vide'
85 SrsMp4BoxTypeSOUN = 0x736f756e, // 'soun' 86 SrsMp4BoxTypeSOUN = 0x736f756e, // 'soun'
@@ -262,6 +263,10 @@ class SrsMp4MovieBox : public SrsMp4Box @@ -262,6 +263,10 @@ class SrsMp4MovieBox : public SrsMp4Box
262 public: 263 public:
263 SrsMp4MovieBox(); 264 SrsMp4MovieBox();
264 virtual ~SrsMp4MovieBox(); 265 virtual ~SrsMp4MovieBox();
  266 +protected:
  267 + virtual int nb_header();
  268 + virtual int encode_header(SrsBuffer* buf);
  269 + virtual int decode_header(SrsBuffer* buf);
265 }; 270 };
266 271
267 /** 272 /**
@@ -1206,6 +1211,26 @@ protected: @@ -1206,6 +1211,26 @@ protected:
1206 }; 1211 };
1207 1212
1208 /** 1213 /**
  1214 + * 8.10.1 User Data Box (udta)
  1215 + * ISO_IEC_14496-12-base-format-2012.pdf, page 78
  1216 + * This box contains objects that declare user information about the containing box and its data (presentation or
  1217 + * track).
  1218 + */
  1219 +class SrsMp4UserDataBox : public SrsMp4Box
  1220 +{
  1221 +public:
  1222 + int nb_data;
  1223 + uint8_t* data;
  1224 +public:
  1225 + SrsMp4UserDataBox();
  1226 + virtual ~SrsMp4UserDataBox();
  1227 +protected:
  1228 + virtual int nb_header();
  1229 + virtual int encode_header(SrsBuffer* buf);
  1230 + virtual int decode_header(SrsBuffer* buf);
  1231 +};
  1232 +
  1233 +/**
1209 * The MP4 demuxer. 1234 * The MP4 demuxer.
1210 */ 1235 */
1211 class SrsMp4Decoder 1236 class SrsMp4Decoder
@@ -1229,6 +1254,8 @@ public: @@ -1229,6 +1254,8 @@ public:
1229 */ 1254 */
1230 virtual int initialize(ISrsReader* r); 1255 virtual int initialize(ISrsReader* r);
1231 private: 1256 private:
  1257 + virtual int parse_moov(SrsMp4MovieBox* box);
  1258 +private:
1232 // Load the next box from reader. 1259 // Load the next box from reader.
1233 // @param required_box_type The box type required, 0 for any box. 1260 // @param required_box_type The box type required, 0 for any box.
1234 virtual int load_next_box(SrsMp4Box** ppbox, uint32_t required_box_type); 1261 virtual int load_next_box(SrsMp4Box** ppbox, uint32_t required_box_type);