正在显示
2 个修改的文件
包含
100 行增加
和
0 行删除
| @@ -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); |
-
请 注册 或 登录 后发表评论