Commit defb4809 authored by Francois Cartegnie's avatar Francois Cartegnie

demux: asf: rewrite main loop and add remuxer (fix #14250)

Creates a reinterleaving buffer. Works better with big prerolls.
(which implies big dts distance in interleaves)
Changes base pts as well, as some strat frames might have been
dropped.
parent a43eb1ab
This diff is collapsed.
......@@ -245,7 +245,6 @@ static int DemuxPayload(asf_packet_sys_t *p_packetsys, asf_packet_t *pkt, int i_
{
/* optional DWORDS missing */
i_base_pts = (mtime_t)pkt->send_time;
i_base_pts -= *p_packetsys->pi_preroll;
}
/* Compressed payload */
else if( i_replicated_data_length == 1 )
......@@ -298,25 +297,17 @@ static int DemuxPayload(asf_packet_sys_t *p_packetsys, asf_packet_t *pkt, int i_
p_packetsys->pf_doskip( p_packetsys, i_stream_number, b_packet_keyframe ) )
goto skip;
bool b_hugedelay = ( *p_packetsys->pi_preroll * 1000 > CLOCK_FREQ * 3 );
if ( b_preroll_done || b_hugedelay )
if ( b_preroll_done )
{
mtime_t i_track_time;
if ( !b_hugedelay )
{
i_track_time = INT64_C(1000) * pkt->send_time;
i_track_time -= *p_packetsys->pi_preroll * 1000;
if ( p_tkinfo->p_sp )
i_track_time -= p_tkinfo->p_sp->i_time_offset * 10;
}
else
i_track_time = i_base_pts;
mtime_t i_track_time = i_base_pts;
if ( p_packetsys->pf_updatetime )
p_packetsys->pf_updatetime( p_packetsys, i_stream_number, i_track_time );
}
if( p_packetsys->pf_updatesendtime )
p_packetsys->pf_updatesendtime( p_packetsys, INT64_C(1000) * pkt->send_time );
uint32_t i_subpayload_count = 0;
while (i_payload_data_length)
{
......@@ -333,14 +324,11 @@ static int DemuxPayload(asf_packet_sys_t *p_packetsys, asf_packet_t *pkt, int i_
if ( p_tkinfo->p_sp )
i_payload_pts -= p_tkinfo->p_sp->i_time_offset * 10;
mtime_t i_payload_dts = INT64_C(1000) * pkt->send_time;
i_payload_dts -= *p_packetsys->pi_preroll * 1000;
mtime_t i_payload_dts = i_base_pts;
if ( p_tkinfo->p_sp )
i_payload_dts -= p_tkinfo->p_sp->i_time_offset * 10;
if ( b_hugedelay )
i_payload_dts = i_base_pts;
if ( i_sub_payload_data_length &&
DemuxSubPayload( p_packetsys, i_stream_number, &p_tkinfo->p_frame,
i_sub_payload_data_length, i_payload_pts, i_payload_dts,
......
......@@ -51,6 +51,7 @@ struct asf_packet_sys_s
/* optional callbacks */
bool (*pf_doskip)(asf_packet_sys_t *, uint8_t, bool);
void (*pf_updatesendtime)(asf_packet_sys_t *, mtime_t);
void (*pf_updatetime)(asf_packet_sys_t *, uint8_t, mtime_t);
void (*pf_setaspectratio)(asf_packet_sys_t *, uint8_t, uint8_t, uint8_t);
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment