Signed-off-by: James Almer <jamrial@gmail.com>
James Almer authored on 2017/11/25 07:47:47... | ... |
@@ -113,54 +113,55 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) |
113 | 113 |
if (len <= 6) |
114 | 114 |
return AVERROR_INVALIDDATA; |
115 | 115 |
|
116 |
- /* check for H.264 start code */ |
|
117 |
- if (AV_RB32(data) != 0x00000001 && |
|
118 |
- AV_RB24(data) != 0x000001) { |
|
119 |
- avio_write(pb, data, len); |
|
120 |
- return 0; |
|
116 |
+ /* check for H.264 start code */ |
|
117 |
+ if (AV_RB32(data) != 0x00000001 && |
|
118 |
+ AV_RB24(data) != 0x000001) { |
|
119 |
+ avio_write(pb, data, len); |
|
120 |
+ return 0; |
|
121 |
+ } |
|
122 |
+ |
|
123 |
+ ret = ff_avc_parse_nal_units_buf(data, &buf, &len); |
|
124 |
+ if (ret < 0) |
|
125 |
+ return ret; |
|
126 |
+ start = buf; |
|
127 |
+ end = buf + len; |
|
128 |
+ |
|
129 |
+ /* look for sps and pps */ |
|
130 |
+ while (end - buf > 4) { |
|
131 |
+ uint32_t size; |
|
132 |
+ uint8_t nal_type; |
|
133 |
+ size = FFMIN(AV_RB32(buf), end - buf - 4); |
|
134 |
+ buf += 4; |
|
135 |
+ nal_type = buf[0] & 0x1f; |
|
136 |
+ |
|
137 |
+ if (nal_type == 7) { /* SPS */ |
|
138 |
+ sps = buf; |
|
139 |
+ sps_size = size; |
|
140 |
+ } else if (nal_type == 8) { /* PPS */ |
|
141 |
+ pps = buf; |
|
142 |
+ pps_size = size; |
|
121 | 143 |
} |
122 | 144 |
|
123 |
- ret = ff_avc_parse_nal_units_buf(data, &buf, &len); |
|
124 |
- if (ret < 0) |
|
125 |
- return ret; |
|
126 |
- start = buf; |
|
127 |
- end = buf + len; |
|
128 |
- |
|
129 |
- /* look for sps and pps */ |
|
130 |
- while (end - buf > 4) { |
|
131 |
- uint32_t size; |
|
132 |
- uint8_t nal_type; |
|
133 |
- size = FFMIN(AV_RB32(buf), end - buf - 4); |
|
134 |
- buf += 4; |
|
135 |
- nal_type = buf[0] & 0x1f; |
|
136 |
- |
|
137 |
- if (nal_type == 7) { /* SPS */ |
|
138 |
- sps = buf; |
|
139 |
- sps_size = size; |
|
140 |
- } else if (nal_type == 8) { /* PPS */ |
|
141 |
- pps = buf; |
|
142 |
- pps_size = size; |
|
143 |
- } |
|
144 |
- |
|
145 |
- buf += size; |
|
146 |
- } |
|
145 |
+ buf += size; |
|
146 |
+ } |
|
147 |
+ |
|
148 |
+ if (!sps || !pps || sps_size < 4 || sps_size > UINT16_MAX || pps_size > UINT16_MAX) |
|
149 |
+ return AVERROR_INVALIDDATA; |
|
150 |
+ |
|
151 |
+ avio_w8(pb, 1); /* version */ |
|
152 |
+ avio_w8(pb, sps[1]); /* profile */ |
|
153 |
+ avio_w8(pb, sps[2]); /* profile compat */ |
|
154 |
+ avio_w8(pb, sps[3]); /* level */ |
|
155 |
+ avio_w8(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ |
|
156 |
+ avio_w8(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ |
|
157 |
+ |
|
158 |
+ avio_wb16(pb, sps_size); |
|
159 |
+ avio_write(pb, sps, sps_size); |
|
160 |
+ avio_w8(pb, 1); /* number of pps */ |
|
161 |
+ avio_wb16(pb, pps_size); |
|
162 |
+ avio_write(pb, pps, pps_size); |
|
163 |
+ av_free(start); |
|
147 | 164 |
|
148 |
- if (!sps || !pps || sps_size < 4 || sps_size > UINT16_MAX || pps_size > UINT16_MAX) |
|
149 |
- return AVERROR_INVALIDDATA; |
|
150 |
- |
|
151 |
- avio_w8(pb, 1); /* version */ |
|
152 |
- avio_w8(pb, sps[1]); /* profile */ |
|
153 |
- avio_w8(pb, sps[2]); /* profile compat */ |
|
154 |
- avio_w8(pb, sps[3]); /* level */ |
|
155 |
- avio_w8(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ |
|
156 |
- avio_w8(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ |
|
157 |
- |
|
158 |
- avio_wb16(pb, sps_size); |
|
159 |
- avio_write(pb, sps, sps_size); |
|
160 |
- avio_w8(pb, 1); /* number of pps */ |
|
161 |
- avio_wb16(pb, pps_size); |
|
162 |
- avio_write(pb, pps, pps_size); |
|
163 |
- av_free(start); |
|
164 | 165 |
return 0; |
165 | 166 |
} |
166 | 167 |
|