MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / ff_mms_asf_header_parser

Function ff_mms_asf_header_parser

libavformat/mms.c:55–160  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

53}
54
55int ff_mms_asf_header_parser(MMSContext *mms)
56{
57 uint8_t *p = mms->asf_header;
58 uint8_t *end;
59 int flags, stream_id;
60 mms->stream_num = 0;
61
62 if (mms->asf_header_size < sizeof(ff_asf_guid) * 2 + 22 ||
63 memcmp(p, ff_asf_header, sizeof(ff_asf_guid))) {
64 av_log(mms->mms_hd, AV_LOG_ERROR,
65 "Corrupt stream (invalid ASF header, size=%d)\n",
66 mms->asf_header_size);
67 return AVERROR_INVALIDDATA;
68 }
69
70 end = mms->asf_header + mms->asf_header_size;
71
72 p += sizeof(ff_asf_guid) + 14;
73 while(end - p >= sizeof(ff_asf_guid) + 8) {
74 uint64_t chunksize;
75 if (!memcmp(p, ff_asf_data_header, sizeof(ff_asf_guid))) {
76 chunksize = 50; // see Reference [2] section 5.1
77 } else {
78 chunksize = AV_RL64(p + sizeof(ff_asf_guid));
79 }
80 if (!chunksize || chunksize > end - p) {
81 av_log(mms->mms_hd, AV_LOG_ERROR,
82 "Corrupt stream (header chunksize %"PRId64" is invalid)\n",
83 chunksize);
84 return AVERROR_INVALIDDATA;
85 }
86 if (!memcmp(p, ff_asf_file_header, sizeof(ff_asf_guid))) {
87 /* read packet size */
88 if (end - p > sizeof(ff_asf_guid) * 2 + 68) {
89 mms->asf_packet_len = AV_RL32(p + sizeof(ff_asf_guid) * 2 + 64);
90 if (mms->asf_packet_len <= 0 || mms->asf_packet_len > sizeof(mms->in_buffer)) {
91 av_log(mms->mms_hd, AV_LOG_ERROR,
92 "Corrupt stream (too large pkt_len %d)\n",
93 mms->asf_packet_len);
94 return AVERROR_INVALIDDATA;
95 }
96 }
97 } else if (!memcmp(p, ff_asf_stream_header, sizeof(ff_asf_guid))) {
98 if (end - p >= (sizeof(ff_asf_guid) * 3 + 26)) {
99 flags = AV_RL16(p + sizeof(ff_asf_guid)*3 + 24);
100 stream_id = flags & 0x7F;
101 //The second condition is for checking CS_PKT_STREAM_ID_REQUEST packet size,
102 //we can calculate the packet size by stream_num.
103 //Please see function send_stream_selection_request().
104 if (mms->stream_num < MMS_MAX_STREAMS &&
105 46 + mms->stream_num * 6 < sizeof(mms->out_buffer)) {
106 mms->streams = av_fast_realloc(mms->streams,
107 &mms->nb_streams_allocated,
108 (mms->stream_num + 1) * sizeof(MMSStream));
109 if (!mms->streams)
110 return AVERROR(ENOMEM);
111 mms->streams[mms->stream_num].id = stream_id;
112 mms->stream_num++;

Callers 2

mms_openFunction · 0.85
get_http_header_dataFunction · 0.85

Calls 2

av_logFunction · 0.85
av_fast_reallocFunction · 0.85

Tested by

no test coverage detected