From: Jaroslav Kysela Date: Thu, 24 Sep 2015 18:39:57 +0000 (+0200) Subject: isom_write_avcc cleanups X-Git-Tag: v4.2.1~2061 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a8140bbcad4c97a8dab584603f2a0f014816fb76;p=thirdparty%2Ftvheadend.git isom_write_avcc cleanups --- diff --git a/src/parsers/parser_avc.c b/src/parsers/parser_avc.c index d23f6d960..0d2f0106f 100644 --- a/src/parsers/parser_avc.c +++ b/src/parsers/parser_avc.c @@ -94,105 +94,94 @@ int avc_parse_nal_units(sbuf_t *sb, const uint8_t *buf_in, int size) } int -avc_parse_nal_units_buf(const uint8_t *buf_in, uint8_t **buf, int *size) +isom_write_avcc(sbuf_t *sb, const uint8_t *data, int len) { - sbuf_t sb; - - sbuf_init(&sb); - - avc_parse_nal_units(&sb, buf_in, *size); + sbuf_t b; + uint8_t *buf, *end; + uint32_t *sps_size_array, *pps_size_array; + uint32_t pps_count, sps_count; + uint8_t **sps_array, **pps_array; + int i, ret; + + if (len <= 6) + return 0; + + if (RB32(data) != 0x00000001 || + RB24(data) != 0x000001) { + sbuf_append(sb, data, len); + return 0; + } - *buf = sb.sb_data; - *size = sb.sb_ptr; - return 0; -} + sbuf_init(&b); + + len = avc_parse_nal_units(&b, data, len); + + buf = b.sb_data; + end = buf + len; + + sps_size_array = pps_size_array = NULL; + pps_count = sps_count = 0; + sps_array = pps_array = NULL; + ret = 0; + + /* look for sps and pps */ + while (end - buf > 4) { + unsigned int size; + uint8_t nal_type; + size = MIN(RB32(buf), end - buf - 4); + buf += 4; + nal_type = buf[0] & 0x1f; + + if ((nal_type == 7) && (size >= 4) && (size <= UINT16_MAX)) { /* SPS */ + sps_array = realloc(sps_array,sizeof(uint8_t*)*(sps_count+1)); + sps_size_array = realloc(sps_size_array,sizeof(uint32_t)*(sps_count+1)); + sps_array[sps_count] = buf; + sps_size_array[sps_count] = size; + sps_count++; + } else if ((nal_type == 8) && (size <= UINT16_MAX)) { /* PPS */ + pps_size_array = realloc(pps_size_array,sizeof(uint32_t)*(pps_count+1)); + pps_array = realloc(pps_array,sizeof (uint8_t*)*(pps_count+1)); + pps_array[pps_count] = buf; + pps_size_array[pps_count] = size; + pps_count++; + } + buf += size; + } -int -isom_write_avcc(sbuf_t *sb, const uint8_t *data, int len) -{ - if (len > 6) { - /* check for h264 start code */ - if (RB32(data) == 0x00000001 || - RB24(data) == 0x000001) { - uint8_t *buf, *end, *start; - uint32_t *sps_size_array=0, *pps_size_array=0; - uint32_t pps_count=0,sps_count=0; - uint8_t **sps_array=0, **pps_array=0; - int i; - - int ret = avc_parse_nal_units_buf(data, &buf, &len); - if (ret < 0) - return ret; - start = buf; - end = buf + len; - - /* look for sps and pps */ - while (end - buf > 4) { - unsigned int size; - uint8_t nal_type; - size = MIN(RB32(buf), end - buf - 4); - buf += 4; - nal_type = buf[0] & 0x1f; - - if ((nal_type == 7) && (size >= 4) && (size <= UINT16_MAX)) { /* SPS */ - sps_array = realloc(sps_array,sizeof(uint8_t*)*(sps_count+1)); - sps_size_array = realloc(sps_size_array,sizeof(uint32_t)*(sps_count+1)); - sps_array[sps_count] = buf; - sps_size_array[sps_count] = size; - sps_count++; - } else if ((nal_type == 8) && (size <= UINT16_MAX)) { /* PPS */ - pps_size_array = realloc(pps_size_array,sizeof(uint32_t)*(pps_count+1)); - pps_array = realloc(pps_array,sizeof (uint8_t*)*(pps_count+1)); - pps_array[pps_count] = buf; - pps_size_array[pps_count] = size; - pps_count++; - } - buf += size; - } - if(!sps_count || !pps_count) { - free(start); - if (sps_count) { - free(sps_array); - free(sps_size_array); - } - if (pps_count) { - free(pps_array); - free(pps_size_array); - } - return -1; - } + if(!sps_count || !pps_count) { + ret = -1; + goto end; + } - sbuf_put_byte(sb, 1); /* version */ - sbuf_put_byte(sb, sps_array[0][1]); /* profile */ - sbuf_put_byte(sb, sps_array[0][2]); /* profile compat */ - sbuf_put_byte(sb, sps_array[0][3]); /* level */ - sbuf_put_byte(sb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ - sbuf_put_byte(sb, 0xe0+sps_count); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ - for (i=0;i 4) { uint32_t len = MIN(RB32(buf), end - buf - 4); @@ -1170,7 +1170,7 @@ int isom_write_hvcc(sbuf_t *pb, const uint8_t *data, int size) end: hvcc_close(&hvcc); - free(start); + sbuf_free(&sb); return ret; }