测试通过,并进行了优化。思路:

  • 拷贝0001到数据区。
  • 得到size,复制size到缓冲区。
  • 循环直到结束。

  为了保证性能,由调用方传递一个临时缓冲区。

  具体代码如下,测试通过:


static int tdav_codec_h264_get_stapa_pay(const uint8_t* in_data, tsk_size_t in_size, const void** out_data, tsk_size_t *out_size, void** temp_buffer, tsk_size_t* temp_size)
{
    uint8_t*   buf = in_data;
    tsk_size_t len = in_size;
    int      dst_len = 0;
    uint8_t *dst     = NULL;

    if (in_size <= H264_FUA_HEADER_SIZE) {
        TSK_DEBUG_ERROR("Too short");
        return -1;
    }

    if (*temp_size < (in_size*2))
    {
        *temp_size   = in_size*2;
        *temp_buffer = tsk_realloc(*temp_buffer, *temp_size);
    }
    dst = *temp_buffer;

    buf ++;
    len --;

    const uint8_t *src = buf;
    int src_len        = len;

    while (src_len > 2) {
        uint16_t nal_size = (src[0] << 8 | src[1]);
        src     += 2;
        src_len -= 2;

        if (nal_size <= src_len)
        {
            memcpy(dst, NAL_START_SEQUENCE, sizeof(NAL_START_SEQUENCE));
            dst     += sizeof(NAL_START_SEQUENCE);
            dst_len += sizeof(NAL_START_SEQUENCE);

            memcpy(dst, src, nal_size);
            dst     += nal_size;
            dst_len += nal_size;
        }
        else
        {
            TSK_DEBUG_ERROR("nal size exceeds length: %d %d\n", nal_size, src_len);
            return -1;
        }

        src     += nal_size;
        src_len -= nal_size;
    }

    *out_data = *temp_buffer;
    *out_size = dst_len;
	
    return 0;
}