Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/lib_ccx/ccx_demuxer.c
Original file line number Diff line number Diff line change
Expand Up @@ -452,6 +452,7 @@ struct demuxer_data *alloc_demuxer_data(void)
data->len = 0;
data->pts = CCX_NOPTS;
data->rollover_bits = 0;
data->prev_pts_33 = 0;
data->tb.num = 1;
data->tb.den = 90000;
data->next_stream = 0;
Expand Down
1 change: 1 addition & 0 deletions src/lib_ccx/ccx_demuxer.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ struct demuxer_data
unsigned char *buffer;
size_t len;
unsigned int rollover_bits; // The PTS rolls over every 26 hours and that can happen in the middle of a stream.
LLONG prev_pts_33; // Previous 33-bit PTS for this stream's rollover detection (per-stream, not shared)
LLONG pts;
struct ccx_rational tb;
struct demuxer_data *next_stream;
Expand Down
9 changes: 4 additions & 5 deletions src/lib_ccx/stream_functions.c
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,6 @@ int read_video_pes_header(struct ccx_demuxer *ctx, struct demuxer_data *data, un
long long result;
unsigned peslen = nextheader[4] << 8 | nextheader[5];
unsigned payloadlength = 0; // Length of packet data bytes
static LLONG current_pts_33 = 0; // Last PTS from the header, without rollover bits

if (!sbuflen)
{
Expand Down Expand Up @@ -437,14 +436,14 @@ int read_video_pes_header(struct ccx_demuxer *ctx, struct demuxer_data *data, un

if (data->pts != CCX_NOPTS) // Otherwise can't check for rollovers yet
{
if (!bits_9 && ((current_pts_33 >> 30) & 7) == 7) // PTS about to rollover
if (!bits_9 && ((data->prev_pts_33 >> 30) & 7) == 7) // PTS about to rollover
data->rollover_bits++;
if ((bits_9 >> 30) == 7 && ((current_pts_33 >> 30) & 7) == 0) // PTS rollback? Rare and if happens it would mean out of order frames
if ((bits_9 >> 30) == 7 && ((data->prev_pts_33 >> 30) & 7) == 0) // PTS rollback? Rare and if happens it would mean out of order frames
data->rollover_bits--;
}

current_pts_33 = bits_9 | bits_10 | bits_11 | bits_12 | bits_13;
data->pts = (LLONG)data->rollover_bits << 33 | current_pts_33;
data->prev_pts_33 = bits_9 | bits_10 | bits_11 | bits_12 | bits_13;
data->pts = (LLONG)data->rollover_bits << 33 | data->prev_pts_33;

/* The user data holding the captions seems to come between GOP and
* the first frame. The sync PTS (sync_pts) (set at picture 0)
Expand Down
Loading