[dvblast-devel] Second PAT generation in PIDs only mode (plus PCR accuracy errors on output)
Georgi Chorbadzhiyski
gf at unixsol.org
Sun Oct 21 00:42:20 CEST 2012
On 10/20/12 7:12 PM, Vladimir Yakovlev wrote:
> I stumbled on some bug. First of all, i checked output of DVBLAST on
> my custom hardware with analyzer DTA-2160
> (http://www.dektec.com/Products/PCIe/DTA-2160/index.asp), and got "Pcr
> Accuracy error". Accuracy was suspiciously high (in order of tens of
> milliseconds). After some analysing, i noticed that DVBlast remove
> NULL packets. If I broadcast from DTA, null packets are present.
>
> So, i tried "PIDs only", wrote in config something like this
> 239.192.0.1:5678 1 0 0,200,201,202,8192
> and got Null packets in output, but also two sets of PAT tables (PID
> 0). One from input stream, other empy, generated by dvblast.
>
> Now I have no time to implement it properly, so I just disable it all together:
> ===================================
> --- ../dvblast-2.2_or/demux.c 2012-09-19 16:36:48.958871023 +0400
> +++ ./demux.c 2012-10-18 15:13:25.904255257 +0400
> @@ -936,6 +936,7 @@
> static void SendPAT( mtime_t i_dts )
> {
> int i;
> + return;
>
> for ( i = 0; i < i_nb_outputs; i++ )
> {
> ===================================
>
> I think it is bug, you probably should look at it.
>
> Another problem was with multiprogram stream. Now DVBlast estimate RTP
> timestamps based on pcr of selected program, with multiprogram input
> it is impossible.
> My hardware (Marvell processor) timestamps each TS packet on input, so
> i just use this time.
> =========================
> diff -u -r ../dvblast-2.2_or/dvblast.h ./dvblast.h
> --- ../dvblast-2.2_or/dvblast.h 2012-10-20 20:05:34.983803272 +0400
> +++ ./dvblast.h 2012-10-20 20:06:01.147803034 +0400
> @@ -70,6 +70,7 @@
> int i_refcount;
> mtime_t i_dts;
> struct block_t *p_next;
> + int timestamp;
> } block_t;
>
> typedef struct packet_t packet_t;
> diff -u -r ../dvblast-2.2_or/marvell.c ./marvell.c
> --- ../dvblast-2.2_or/marvell.c 2012-10-20 20:05:34.983803272 +0400
> +++ ./marvell.c 2012-10-20 20:08:19.479801766 +0400
> @@ -72,6 +72,7 @@
> int ret;
> int i;
> block_t *p_ts, **pp_current = &p_ts;
> + double time;
>
> //printf("marvell read\n");
> pfd[0].fd = i_handle;
> @@ -96,6 +97,9 @@
> }
> else{
> //printf("read %d\n", ret);*/
> + time = buf[0]|(buf[1]<<8)|(buf[2]<<16)|(buf[3]<<24);
> + time = time*0.192/11.111;
> + p_ts->timestamp = (int)time;
> memcpy(p_ts->p_ts, buf+4, 188);
> return p_ts;
> }
> diff -u -r ../dvblast-2.2_or/output.c ./output.c
> --- ../dvblast-2.2_or/output.c 2012-10-20 20:05:34.983803272 +0400
> +++ ./output.c 2012-10-20 20:06:01.143803033 +0400
> @@ -261,9 +261,7 @@
> rtp_set_type( p_rtp_hdr, RTP_TYPE_TS );
> rtp_set_seqnum( p_rtp_hdr, p_output->i_seqnum++ );
> rtp_set_timestamp( p_rtp_hdr,
> - p_output->i_ref_timestamp
> - + (p_packet->i_dts - p_output->i_ref_wallclock)
> - * 9 / 100 );
> + p_packet->p_blocks->timestamp);
> rtp_set_ssrc( p_rtp_hdr, p_output->config.pi_ssrc );
>
> i_iov = 1;
> ==============================
> After those changes I was able to get accurate stream, with no errors
> at all. PCR accuracy 0ns :)
> I have no idea, how implement it on native DVBlast :)
IMO these are hacks just to make some analyzer happy :) You can use them
since they work for you but they are of no use for generic dvblast.
By the way packet->i_dts is not coming from the stream, it is initialized
from the computer clock, the field naming is misleading.
--
Georgi Chorbadzhiyski
http://georgi.unixsol.org/
More information about the dvblast-devel
mailing list