ts_indexer: fix HEVC lost slice issue. [1/1]
PD#SWPL-119993
Problem:
some HEVC slice missed if match 0x00000001.
The leading_zero_8bit 0x00 only be present in the first byte stream NAL unit
of the bitstream.
Solution:
use start code 0x000001 to find NALU for AVC/HEVC.
Verify:
linux
Change-Id: I9e9083b86c8d80ab176b82c5706175d28028cd4b
Signed-off-by: Yahui Han <yahui.han@amlogic.com>
diff --git a/src/ts_indexer.c b/src/ts_indexer.c
index cd1a67f..85ec093 100644
--- a/src/ts_indexer.c
+++ b/src/ts_indexer.c
@@ -258,16 +258,15 @@
return NULL;
//INF("%s enter, len:%#lx\n", __func__, len);
-if (is_hevc) {
- while (i < len - 5) {
- if (p[i] == 0x00 && p[i+1] == 0x00 && p[i+2] == 0x00 && p[i+3] == 0x01) {
+ while (i < len - 4) {
+ if (p[i] == 0x00 && p[i+1] == 0x00 && p[i+2] == 0x01) {
uint8_t *frame_data = data + i;
size_t frame_data_len = 0;
i += 4;
//INF("%s start code prefix\n", __func__);
- for (size_t j = i ; j < len - 5; ++j) {
- if (p[j] == 0x00 && p[j+1] == 0x00 && p[j+2] == 0x00 && p[j+3] == 0x01) {
+ for (size_t j = i ; j < len - 4; ++j) {
+ if (p[j] == 0x00 && p[j+1] == 0x00 && p[j+2] == 0x01) {
frame_data_len = j - i;
break;
}
@@ -289,47 +288,6 @@
return NULL;
}
- while ( i < len - 4) {
- if ((p[i] == 0x00 && p[i+1] == 0x00 && p[i+2] == 0x01) ||
- (p[i] == 0x00 && p[i+1] == 0x00 && p[i+2] == 0x00 && p[i+3] == 0x01)) {
- uint8_t *frame_data = data + i;
- size_t frame_data_len = 0;
-
- if (p[i] == 0x00 && p[i+1] == 0x00 && p[i+2] == 0x01) {
- i += 3;
- //ERR("find 0x00 0x00 0x01 startcode\n");
- } else {
- i += 4;
- //ERR("find 0x00 0x00 0x00 0x01 startcode\n");
- }
-
- //INF("%s start code prefix\n", __func__);
- size_t j = i;
- while (j < len - 4) {
- if ((p[j] == 0x00 && p[j+1] == 0x00 && p[j+2] == 0x01) ||
- (p[j] == 0x00 && p[j+1] == 0x00 && p[j+2] == 0x00 && p[j+3] == 0x01)) {
- frame_data_len = j - i;
- break;
- }
- j ++;
- }
-
- if (frame_data_len > 0) {
- *nalu_len = frame_data_len;
- return frame_data;
- } else {
- frame_data_len = len - i;
- *nalu_len = frame_data_len;
- return frame_data;
- }
- } else {
- i ++;
- }
- }
-
- return NULL;
-}
-
uint32_t golomb_uev(uint32_t *pu4_bitstrm_ofst, uint32_t *pu4_bitstrm_buf)
{
uint32_t u4_bitstream_offset = *pu4_bitstrm_ofst;
@@ -380,7 +338,7 @@
for (;;) {
int left = pes_data_len - (nalu - data);
- if (left <= 6) {
+ if (left <= 5) {
memcpy(&stream->PES.data[0], nalu, left);
stream->PES.len = left;
break;
@@ -392,8 +350,6 @@
if (nalu[0] == 0x00 && nalu[1] == 0x00 && nalu[2] == 0x01) {
p = &nalu[3];
- } else if (nalu[0] == 0x00 && nalu[1] == 0x00 && nalu[2] == 0x00 && nalu[3] == 0x01) {
- p = &nalu[4];
}
uint32_t offset = 0;
@@ -481,9 +437,10 @@
if (nalu == NULL)
break;
- if (nalu[0] == 0x00 && nalu[1] == 0x00 && nalu[2] == 0x00 && nalu[3] == 0x01) {
- int nalu_type = (nalu[4] & 0x7E) >> 1;
- //INF("nalu[3]: %#x, nalu_type: %#x\n", nalu[3], nalu_type);
+ if (nalu[0] == 0x00 && nalu[1] == 0x00 && nalu[2] == 0x01) {
+ int nalu_type = (nalu[3] & 0x7E) >> 1;
+ INF("0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x, nalu_type: %d, offset: %#lx\n",
+ nalu[3], nalu[4], nalu[5], nalu[6], nalu[7], nalu[8], nalu_type, event.offset);
switch (nalu_type) {
case HEVC_NALU_BLA_W_LP:
event.type = TS_INDEXER_EVENT_TYPE_HEVC_BLA_W_LP;
diff --git a/test/ts_indexer_test/ts_indexer_test.c b/test/ts_indexer_test/ts_indexer_test.c
index 6c1e2c2..8185c30 100644
--- a/test/ts_indexer_test/ts_indexer_test.c
+++ b/test/ts_indexer_test/ts_indexer_test.c
@@ -60,16 +60,14 @@
break;
case TS_INDEXER_EVENT_TYPE_VIDEO_PTS:
- #if 0
+ #if 1
INF("PID: %#x ", event->pid);
INF("TS_INDEXER_EVENT_TYPE_VIDEO_PTS, Offset: %lx, Lastoffset: %lx, Pts: %lx\n",
event->offset, gControl.last_offset, event->pts);
write_len = ts_indexer->offset - gControl.last_offset;
if (gControl.dump_file) {
- INF("ptr: %p, write_len: %#x\n", gControl.ptr, write_len);
fwrite(gControl.ptr, 1, write_len, gControl.dump_file);
gControl.ptr += write_len;
- INF("ptr: %p\n", gControl.ptr);
}
gControl.last_offset = ts_indexer->offset;
#endif
@@ -100,7 +98,7 @@
case TS_INDEXER_EVENT_TYPE_HEVC_IDR_W_RADL:
case TS_INDEXER_EVENT_TYPE_HEVC_IDR_N_LP:
case TS_INDEXER_EVENT_TYPE_HEVC_TRAIL_CRA:
- INF("type: %d, offset: %lx\n", event->type, event->offset);
+ INF("type: %d, offset: %#lx\n", event->type, event->offset);
break;
default: