Signed-off-by: James Almer <jamrial@gmail.com>
| ... | ... |
@@ -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 |
|