You are not logged in.

Dear visitor, welcome to VDR Portal. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Friday, August 13th 2010, 5:55pm

[gelöst] Das Abspielen von Aufnahmen wird erst nach einiger Zeit stabil oder nie, betrifft auch Sprünge

Hallo, ich habe ein langsames System mit Celeron III @1333 und eine Geforce 8400 GS PCI.
Beim Abspielen einer 720p Aufnahme dauert es 10 bis 60 Sekunden bis die Framedrops aufhören und der Ton stabil kommt. Dabei wird der letzte Wert diff in den „throwing away …“ Meldungen langsam immer kleiner, bis diese nicht mehr kommen.
Dies betrifft auch Sprünge in Aufnahmen mittels Gelb/Grün Taste um +/- 60 Sekunden.

Manchmal hören die Framedrops gar nicht auf; das ist aber nicht gezielt reproduzierbar. Dabei geht der Wert diff in den „throwing away …“ Meldungen immer weiter hoch statt runter.

In beiden Fällen nimmt sich xine, solange die Meldungen „throwing away …“ kommen, fast die gesamte verfügbare cpu.

Beim Umschalten auf einen 720p Sender wird die Anzeige praktisch sofort stabil. Das Problem tritt also nicht bei live TV, sondern nur beim Abspielen von Aufnahmen auf.

Wenn ich beim Abspielen einer Aufnahme die Geschwindigkeit reduziere, stabilisiert sich das Abspielen viel schneller und auch zuverlässig (also selbst wenn vorher diff hoch ging), und wenn ich danach wieder auf normale Geschwindigkeit gehe, bleibt es stabil.
Das mache ich mit 2mal „Pfeil runter“, und nach dem stabilisieren wieder 2mal „Pfeil hoch“ auf der Tastatur. Oder auf der Fernbedienung mit „runter“, „rechts“, warten bis stabil, „hoch“.

Es wäre natürlich viel schöner, wenn xine das in der Software automatisch machen könnte.

Bin ich der Einzige, oder gibt es noch andere mit dem gleichen Problem?
Falls jemand mit vergleichbar langsamer Hardware dieses Problem nicht hat, wüsste ich gerne die Einstellungen der config Dateien. Da ich aber schon alles ausprobiert habe, glaube ich eher, dass xine auf langsamer Hardware nicht optimal arbeitet.

Wenn xine die schnellen Framedrops bei hohem diff überwachen würde, und solange die Geschwindigkeit stark reduziert, wäre das Problem gelöst.
Leider bin ich kein Programmierer und kann das nicht selbst flicken.
Falls jemand, der sich auskennt, mir hilft, wäre ich sehr dankbar.
Ich hatte schon überlegt, mir ein schnelleres System zu kaufen, aber nachdem ich dies heraus gefunden habe, bin ich sicher, dass es ein Softwareproblem ist.

Jörg

vdr 1.7.15, vdr-xine oder xineliboutput, vdpau und xine cvs pur oder mit diversen patches, nvidia treiber 195.30 – 256.44.

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)

This post has been edited 2 times, last edit by "jrie" (Apr 2nd 2011, 2:11am)


2

Monday, August 16th 2010, 9:10pm

Hallo, mit diesem Patch geht es. Damit kann ich durch HD Aufnahmen springen, und das Abspielen stabilisiert sich kurz nach dem Sprung. Vorher dauerte das mindestens 10 bis 60 Sekunden, oder es wurde gar nicht mehr stabil.
Falls es noch jemandem hilft, würde ich mich über ein feedback freuen.
Jörg

anzuwenden auf /xine-lib/src/xine-engine/video_out.c

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--- video_out.c.bak	2010-08-16 20:23:39.928949257 +0200
+++ video_out.c	2010-08-16 20:33:27.681943272 +0200
@@ -835,6 +835,18 @@
     pts = img->vpts;
     diff = cur_vpts - pts;
 
+    int prev_speed = _x_get_fine_speed(img->stream);
+    if ((prev_speed == 1000000) && (diff > 10000)) { /* reduce speed, if diff is too high at normal speed*/
+      xine_log(this->xine, XINE_LOG_MSG,
+	         _("set speed slow because diff is too high\n"));
+      _x_set_fine_speed(img->stream, 124000);
+    }  
+    if (prev_speed == 124000 && (diff < 3000)) { /* check for special speed 124000, and if diff is small enough, go back to normal speed, this could be done better */
+      xine_log(this->xine, XINE_LOG_MSG,
+	         _("set speed normal because diff is low enough\n"));
+      _x_set_fine_speed(img->stream, 1000000);
+    }
+    
     if (diff > duration || this->discard_frames) {
 
       if( !this->discard_frames ) {

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)

3

Monday, August 16th 2010, 9:44pm

hi,

evtl. postest du das auch hier noch mal an passender stelle sonst findet es keinen weg in die entwicklung?
http://www.xine-project.org

4

Monday, August 16th 2010, 10:42pm

Ja, hatte ich schon auf xine-devel gemailt.

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)

5

Tuesday, August 17th 2010, 10:23am

Der o.g. Patch dürfte aber wirklich nur für leistungsarme VDR's Sinn machen. Auf meinem System hakelt es mit diesem Patch beim starten von HD-Aufnahmen 2-3 mal. Ohne Patch laufen die Aufnahmen problemlos sofort ...ohne Ruckeln.

Gruß
iNOB

Mein VDR

Hartware: Gehäuse: Ahanix MCE 302, Mobo: Kontron 986LCD-M/mITX, CPU: Intel Core2 Duo Mobile T7400 2,16GHz, 2GB RAM, SAT: Digital Devices DuoFlex S2 miniPCIe, Graka: ASUS EN210 Silent 1GD3, 4x2TB 3,5" WD HD, 1x DVD-Brenner Pioneer, Atric IR-Einschalter+Empfänger, FB One-For-All URC-7960, SoundGraph iMON LCD ( MFP5I, 15c2:0038 )
Weichware: Wheezy (x86_64), Kernel 3.8.13, NVidia v337.12, VDR 2.1.6 gepatched

6

Tuesday, August 17th 2010, 10:47am

Bei mir ist es beim Starten des Abspielens einer HD Aufnahme so:
Zuerst kurz Ton und stehendes Bild,
dann 1-2 Sekunden kein Ton und Zeitlupe,
dann normal Ton und Bild.
Die zweite Phase kommt vom Patch und dies erscheint vermutlich als hakeln.

Bei mir macht allerdings erst dieser Patch mein langsames System voll HD tauglich.
Ein weiterer positiver Effekt ist, dass ich damit auch HD Aufnahmen während der Aufnahme abspielen kann, das ging ohne Patch meistens gar nicht.
Und der Cpu Peak ist jetzt nur noch ganz kurz.

Ich finde es aber gut zu wissen, dass der Patch auf schnellen Systemen ungünstig ist. Deswegen sollte man ihn vermutlich an/abschaltbar machen.

Würdest du mal die Ausgabe von xine --verbose=2 mit Patch und dem mehrmaligen Hakeln posten, und auch die Ausgabe ohne patch zum Vergleich?

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)

This post has been edited 1 times, last edit by "jrie" (Aug 17th 2010, 10:52am)


7

Thursday, August 26th 2010, 10:26pm

gelöscht

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)

This post has been edited 1 times, last edit by "jrie" (Mar 30th 2011, 6:16pm)


8

Saturday, August 28th 2010, 5:18pm

gelöscht

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)

This post has been edited 1 times, last edit by "jrie" (Mar 30th 2011, 6:17pm)


9

Saturday, August 28th 2010, 6:58pm

Hier die letzte Version von meinem patch:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
--- video_out.c.orig	2010-08-16 20:23:39.000000000 +0200
+++ video_out.c	2010-08-28 17:03:33.008200695 +0200
@@ -62,6 +62,7 @@
  * vo driver). up to 25% less cpu load using deinterlace with film mode.
  */
 #define EXPERIMENTAL_FRAME_QUEUE_OPTIMIZATION 1
+#define SLOW_SYSTEM 1
 
 static vo_frame_t * crop_frame( xine_video_port_t *this_gen, vo_frame_t *img );
 
@@ -835,6 +836,32 @@
     pts = img->vpts;
     diff = cur_vpts - pts;
 
+#if SLOW_SYSTEM
+    int slow_speed = 124000;
+    struct timeval start_slow_speed;
+    struct timeval stop_slow_speed;
+    int prev_speed = _x_get_fine_speed(img->stream);
+    if ((prev_speed == 1000000) && (diff > 10000)) { /* reduce speed, if diff is too high at normal speed */
+      xine_log(this->xine, XINE_LOG_MSG,
+	         _("set speed slow because diff is too high\n"));
+      gettimeofday(&start_slow_speed, NULL);
+      xine_log(this->xine, XINE_LOG_MSG,
+	         _("slow speed started at: %u : %u \n"), start_slow_speed.tv_sec, start_slow_speed.tv_usec);
+      _x_set_fine_speed(img->stream, slow_speed);
+    }
+    if (prev_speed == slow_speed && (diff < 3000)) { /* check for slow_speed , and if diff is small enough, go back to normal speed */
+      xine_log(this->xine, XINE_LOG_MSG,
+	         _("set speed normal because diff is low enough\n"));
+      gettimeofday(&stop_slow_speed, NULL);
+      xine_log(this->xine, XINE_LOG_MSG,
+	         _("slow speed stopped at: %u : %u \n"), stop_slow_speed.tv_sec, stop_slow_speed.tv_usec);
+      _x_set_fine_speed(img->stream, 1000000);
+      int64_t slow_speed_duration = ((stop_slow_speed.tv_sec - start_slow_speed.tv_sec) * 1e6 + (stop_slow_speed.tv_usec - start_slow_speed.tv_usec));
+      xine_log(this->xine, XINE_LOG_MSG,
+	         _("slow speed duration was %" PRId64 " microseconds\n"), slow_speed_duration);
+    }
+#endif SLOW_SYSTEM
+
     if (diff > duration || this->discard_frames) {
 
       if( !this->discard_frames ) {

Er ist auch nützlich um die xine config Parameter zu optimieren, einfach Parameter ändern und schauen, ob slow_speed_duration länger oder kürzer wird (greift nur bei manchen Parametern).
Damit habe ich z.B. gemerkt, dass bei mir video_num_frames 30 besser ist als 22. Mehr als 30 oder weniger als 22 macht keinen Sinn, da es bei vdpau in xine abgefangen wird. Auch video_num_buffers kann man damit schön optimieren.

Nun noch etwas merkwürdiges:
Ich habe beobachtet, das Sprünge auf eine Zeit (Goto) nicht von dem Problem betroffen sind, sondern nur Vor/Rück-Sprünge (SkipSeconds).
Mit dieser Änderung in dvbplayer von vdr erziele ich auch eine Verbesserung (abgesehen von der Nebenwirkung, dass wenn man aus einem Standbild springt, er nicht automatisch weiterspielt).

Source code

1
2
3
4
5
6
7
8
9
10
11
12
--- dvbplayer.c.orig	2010-03-07 15:24:26.000000000 +0100
+++ dvbplayer.c	2010-08-24 15:16:26.000000000 +0200
@@ -760,7 +760,8 @@
         if (Index > 0)
            Index = index->GetNextIFrame(Index, false, NULL, NULL, NULL, true);
         if (Index >= 0)
-           readIndex = Index - 1; // Action() will first increment it!
+//           readIndex = Index - 1; // Action() will first increment it!
+	   Goto(Index, false);
         }
      Play();
      }

Möglicherweise deutet das darauf hin, dass irgendwo ein Puffer geflusht werden müsste?
Aber das ist mir zu hoch, ich bin schon froh, dass ich überhaupt so weit gekommen bin, und überlasse den Rest den Entwicklern (vdr, xine-vdr und xine).

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)

This post has been edited 1 times, last edit by "jrie" (Mar 31st 2011, 1:18pm)


10

Sunday, August 29th 2010, 2:35pm

Noch einige Anmerkungen.

Das Problem existiert auch, wenn ich eine Aufnahme direkt in xine abspiele, also vdr und vdr-xine umgehe. Der Start und Sprünge mittels C-x oder <-,-> sind genauso betroffen. Erstmal sieht es also nach einem Problem in xine aus.

Andererseits haben Goto-Sprünge in vdr mittels Rot und Zeitangabe dieses Problem nicht, und SkipSeconds-Sprünge mit Gelb/Grün nach dem Patch auch nicht mehr, so dass eine Änderung in vdr das Problem löst. Liegt es also doch an vdr?

Was mir noch fehlt, ist eine Lösung in vdr für das Starten.

Ich vermute, dass schnelle Systeme genauso betroffen sind, nur dass hier die Störungen so kurz sind, dass es nicht weiter auffällt.

Ich habe 99% mit vdr-xine getestet, mit xineliboutput ist es aber genauso.

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)

11

Saturday, January 22nd 2011, 3:38pm

Diese Version vom slow_system Patch ist konfigurierbar, man kann ihn in der xine config an oder aus stellen. Das ist bequemer als jedes mal neu kompilieren und man kann dort auch slow_speed verändern.

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
diff -Nru a/src/xine-engine/video_out.c b/src/xine-engine/video_out.c
--- a/src/xine-engine/video_out.c	2011-01-22 15:19:08.000000000 +0100
+++ b/src/xine-engine/video_out.c	2011-01-22 04:00:07.000000000 +0100
@@ -62,6 +62,7 @@
  * vo driver). up to 25% less cpu load using deinterlace with film mode.
  */
 #define EXPERIMENTAL_FRAME_QUEUE_OPTIMIZATION 1
+#define SLOW_SYSTEM 1
 
 static vo_frame_t * crop_frame( xine_video_port_t *this_gen, vo_frame_t *img );
 
@@ -835,6 +836,39 @@
     pts = img->vpts;
     diff = cur_vpts - pts;
 
+#if SLOW_SYSTEM
+//    int slow_speed = 124000;
+    int slow_speed = this->xine->config->register_num (this->xine->config, "video_out.slow_speed",1000000, /* default */
+         _("default slow_speed"),
+         _("slow_speed while waiting for stable replay, 1000000=disabled, try 124000 on a slow system, avoid 50000, 25000, etc"), 20, NULL, NULL);
+    if (slow_speed < 1) slow_speed = 1;
+    if (slow_speed > 1000000) slow_speed = 1000000;
+    struct timeval start_slow_speed;
+    struct timeval stop_slow_speed;
+    int prev_speed = _x_get_fine_speed(img->stream);
+    if (!(slow_speed == 1000000) && (prev_speed == 1000000) && (diff > 25000)) { /* reduce speed, if diff is too high at normal speed */
+//    if ((prev_speed == 1000000) && (diff > 10000)) { /* reduce speed, if diff is too high at normal speed */
+      xine_log(this->xine, XINE_LOG_MSG,
+	         _("set speed slow because diff is too high\n"));
+      gettimeofday(&start_slow_speed, NULL);
+      xine_log(this->xine, XINE_LOG_MSG,
+	         _("slow speed started at: %u : %u \n"), start_slow_speed.tv_sec, start_slow_speed.tv_usec);
+      _x_set_fine_speed(img->stream, slow_speed);
+    }
+    if (!(slow_speed == 1000000) && prev_speed == slow_speed && (diff < 3000)) { /* check for slow_speed , and if diff is small enough, go back to normal speed */
+//    if (prev_speed == slow_speed && (diff < 3000)) { /* check for slow_speed , and if diff is small enough, go back to normal speed */
+      xine_log(this->xine, XINE_LOG_MSG,
+	         _("set speed normal because diff is low enough\n"));
+      gettimeofday(&stop_slow_speed, NULL);
+      xine_log(this->xine, XINE_LOG_MSG,
+	         _("slow speed stopped at: %u : %u \n"), stop_slow_speed.tv_sec, stop_slow_speed.tv_usec);
+      _x_set_fine_speed(img->stream, 1000000);
+      int64_t slow_speed_duration = ((stop_slow_speed.tv_sec - start_slow_speed.tv_sec) * 1e6 + (stop_slow_speed.tv_usec - start_slow_speed.tv_usec));
+      xine_log(this->xine, XINE_LOG_MSG,
+	         _("slow speed duration was %" PRId64 " microseconds\n"), slow_speed_duration);
+    }
+#endif SLOW_SYSTEM
+
     if (diff > duration || this->discard_frames) {
 
       if( !this->discard_frames ) {


Der dvbplayer.c Patch ist bei mir auch immer noch nötig.
Das Ganze ist vermutlich nur ein workaround, aber ohne macht es auf meinem langsamem System keinen Spaß, und mit geht es zufriedenstellend.

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)

This post has been edited 1 times, last edit by "jrie" (Jan 22nd 2011, 3:39pm)


12

Wednesday, March 30th 2011, 6:18pm

Hier ein eleganterer dvbplayer.c patch, da sieht man klarer was hilft. Das warum ist mir immer noch nicht klar.

Source code

1
2
3
4
5
6
7
8
9
10
11
--- dvbplayer.c.orig2010-03-07 15:24:26.000000000 +0100
+++ dvbplayer.c 2011-03-30 16:01:25.637521665 +0200
@@ -760,7 +760,7 @@
     if (Index > 0)
        Index = index->GetNextIFrame(Index, false, NULL, NULL, NULL, true);
     if (Index >= 0)
-       readIndex = Index - 1; // Action() will first increment it!
+       readIndex = Index; //Index - 1 verursacht Probleme in xine
     }
  Play();
  }

Mit patch sieht der xine log bei einem Sprung +1 Minute so aus:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
ao_flush (loop running: 1)
ao_close
audio_out: no streams left, closing driver
audio discontinuity #103, type is 0, disc_off 0
waiting for in_discontinuity update #103
vdpau_set_property: property=0, value=0
vo_vdpau: deinterlace: none
video discontinuity #103, type is 0, disc_off 0
vpts adjusted with prebuffer to 11532848
ao_flush (loop running: 1)
audio discontinuity #104, type is 0, disc_off 0
waiting for in_discontinuity update #104
video discontinuity #104, type is 0, disc_off 0
vpts adjusted with prebuffer to 11533252
audio discontinuity #105, type is 2, disc_off 7082885999
waiting for in_discontinuity update #105
video discontinuity #105, type is 2, disc_off 7082885999
vpts adjusted with prebuffer to 11535186
load_plugins: plugin a/52 will be used for audio streamtype 00.
audio_oss_out: ao_open rate=48000, mode=8, dev=/dev/dsp
audio_oss_out: audio rate : 48000 requested, 48000 provided by device
audio_oss_out: 2 channels output
output sample rate 48000
audio jump, diff=0
vdpau_set_property: property=0, value=0
vo_vdpau: deinterlace: none
load_plugins: plugin vdpau_h264 will be used for video streamtype 4d.
Allocate 5 reference frames
vdpau_set_property: property=0, value=1
vo_vdpau: deinterlace: temporal
Create decoder: vdp_device: 1, profile: 7, res: 1280x720
H264: mmc 1 failed: 0 not existent - curr_pic: 3
H264: mmc 1 failed: 2 not existent - curr_pic: 3
H264: mmc 1 failed: -5 not existent - curr_pic: 7
video jump

Ohne patch dagegen so:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
ao_flush (loop running: 1)
ao_close
audio_out: no streams left, closing driver
audio discontinuity #23, type is 0, disc_off 0
waiting for in_discontinuity update #23
vdpau_set_property: property=0, value=0
vo_vdpau: deinterlace: none
video discontinuity #23, type is 0, disc_off 0
vpts adjusted with prebuffer to 6463960
ao_flush (loop running: 1)
audio discontinuity #24, type is 0, disc_off 0
waiting for in_discontinuity update #24
video discontinuity #24, type is 0, disc_off 0
vpts adjusted with prebuffer to 6464368
audio discontinuity #25, type is 2, disc_off 7059425227
waiting for in_discontinuity update #25
video discontinuity #25, type is 2, disc_off 7059425227
vpts adjusted with prebuffer to 6465617
vdpau_set_property: property=0, value=0
vo_vdpau: deinterlace: none
load_plugins: plugin vdpau_h264 will be used for video streamtype 4d.
load_plugins: plugin a/52 will be used for audio streamtype 00.
audio_oss_out: ao_open rate=48000, mode=8, dev=/dev/dsp
audio_oss_out: audio rate : 48000 requested, 48000 provided by device
audio_oss_out: 2 channels output
output sample rate 48000
audio jump, diff=132188
Allocate 5 reference frames
vdpau_set_property: property=0, value=1
vo_vdpau: deinterlace: temporal
Create decoder: vdp_device: 1, profile: 7, res: 1280x720
H264: mmc 1 failed: 8 not existent - curr_pic: 11
H264: mmc 1 failed: 10 not existent - curr_pic: 11
H264: mmc 1 failed: 3 not existent - curr_pic: 15
video jump
video_out: throwing away image with pts 6467417 because it's too old (diff : 54069).
video_out: throwing away image with pts 6468257 because it's too old (diff : 53229).
video_out: throwing away image with pts 6469129 because it's too old (diff : 52357).
video_out: throwing away image with pts 6470032 because it's too old (diff : 51454).
video_out: throwing away image with pts 6470965 because it's too old (diff : 50521).
video_out: throwing away image with pts 6471927 because it's too old (diff : 49559).
video_out: throwing away image with pts 6472917 because it's too old (diff : 48569).
video_out: throwing away image with pts 6473934 because it's too old (diff : 47552).
video_out: throwing away image with pts 6474977 because it's too old (diff : 46842).
video_out: throwing away image with pts 6476045 because it's too old (diff : 53128).
video_out: throwing away image with pts 6477138 because it's too old (diff : 52035).
video_out: throwing away image with pts 6478254 because it's too old (diff : 51038).
video_out: throwing away image with pts 6479393 because it's too old (diff : 54713).
video_out: throwing away image with pts 6480554 because it's too old (diff : 53552).
video_out: throwing away image with pts 6481737 because it's too old (diff : 52369).
video_out: throwing away image with pts 6482940 because it's too old (diff : 55768).
video_out: throwing away image with pts 6484223 because it's too old (diff : 54485).
video_out: throwing away image with pts 6485523 because it's too old (diff : 53185).
video_out: throwing away image with pts 6486840 because it's too old (diff : 55659).
video_out: throwing away image with pts 6488173 because it's too old (diff : 54326).
video_out: throwing away image with pts 6489522 because it's too old (diff : 52977).
video_out: throwing away image with pts 6490886 because it's too old (diff : 55466).
video_out: throwing away image with pts 6492264 because it's too old (diff : 54088).
video_out: throwing away image with pts 6493656 because it's too old (diff : 52696).
video_out: throwing away image with pts 6495062 because it's too old (diff : 55236).
video_out: throwing away image with pts 6496481 because it's too old (diff : 53817).
video_out: throwing away image with pts 6497913 because it's too old (diff : 52385).
video_out: throwing away image with pts 6499357 because it's too old (diff : 54973).
video_out: throwing away image with pts 6500813 because it's too old (diff : 53517).
video_out: throwing away image with pts 6502280 because it's too old (diff : 52050).
video_out: throwing away image with pts 6503758 because it's too old (diff : 55058).
video_out: throwing away image with pts 6505247 because it's too old (diff : 53569).
video_out: throwing away image with pts 6506746 because it's too old (diff : 52070).
video_out: throwing away image with pts 6508256 because it's too old (diff : 50934).
video_out: throwing away image with pts 6509775 because it's too old (diff : 53171).
video_out: throwing away image with pts 6511304 because it's too old (diff : 51642).
video_out: throwing away image with pts 6512842 because it's too old (diff : 50104).
video_out: throwing away image with pts 6514388 because it's too old (diff : 52533).
video_out: throwing away image with pts 6515943 because it's too old (diff : 50978).
video_out: throwing away image with pts 6517506 because it's too old (diff : 49415).
video_out: throwing away image with pts 6519077 because it's too old (diff : 52270).
video_out: throwing away image with pts 6520655 because it's too old (diff : 50692).
video_out: throwing away image with pts 6522241 because it's too old (diff : 49106).
video_out: throwing away image with pts 6523834 because it's too old (diff : 51764).
video_out: throwing away image with pts 6525434 because it's too old (diff : 50164).
video_out: throwing away image with pts 6527041 because it's too old (diff : 48557).
video_out: throwing away image with pts 6528654 because it's too old (diff : 51240).
video_out: throwing away image with pts 6530273 because it's too old (diff : 49621).
video_out: throwing away image with pts 6531898 because it's too old (diff : 48112).
video_out: throwing away image with pts 6533529 because it's too old (diff : 50376).
video_out: throwing away image with pts 6535166 because it's too old (diff : 48739).
video_out: throwing away image with pts 6536808 because it's too old (diff : 47097).
video_out: throwing away image with pts 6538455 because it's too old (diff : 49511).
video_out: throwing away image with pts 6540108 because it's too old (diff : 47858).
video_out: throwing away image with pts 6541765 because it's too old (diff : 46201).
video_out: throwing away image with pts 6543427 because it's too old (diff : 48561).
video_out: throwing away image with pts 6545094 because it's too old (diff : 46894).
video_out: throwing away image with pts 6546765 because it's too old (diff : 45223).
video_out: throwing away image with pts 6548441 because it's too old (diff : 47396).
video_out: throwing away image with pts 6550121 because it's too old (diff : 45716).
video_out: throwing away image with pts 6551805 because it's too old (diff : 44032).
video_out: throwing away image with pts 6553493 because it's too old (diff : 46445).
video_out: throwing away image with pts 6555184 because it's too old (diff : 44754).
video_out: throwing away image with pts 6556879 because it's too old (diff : 43059).
video_out: throwing away image with pts 6558577 because it's too old (diff : 45631).
video_out: throwing away image with pts 6560279 because it's too old (diff : 43929).
video_out: throwing away image with pts 6561984 because it's too old (diff : 42224).
video_out: throwing away image with pts 6563692 because it's too old (diff : 44424).
video_out: throwing away image with pts 6565403 because it's too old (diff : 42713).
video_out: throwing away image with pts 6567117 because it's too old (diff : 40999).
video_out: throwing away image with pts 6568834 because it's too old (diff : 43118).
video_out: throwing away image with pts 6570554 because it's too old (diff : 41398).
video_out: throwing away image with pts 6572277 because it's too old (diff : 39675).
video_out: throwing away image with pts 6574002 because it's too old (diff : 41742).
video_out: throwing away image with pts 6575730 because it's too old (diff : 40014).
video_out: throwing away image with pts 6577460 because it's too old (diff : 38284).
video_out: throwing away image with pts 6579192 because it's too old (diff : 40515).
video_out: throwing away image with pts 6580927 because it's too old (diff : 38780).
video_out: throwing away image with pts 6582664 because it's too old (diff : 37043).
video_out: throwing away image with pts 6584403 because it's too old (diff : 39815).
video_out: throwing away image with pts 6586144 because it's too old (diff : 38074).
video_out: throwing away image with pts 6587887 because it's too old (diff : 36331).
video_out: throwing away image with pts 6589632 because it's too old (diff : 38332).
video_out: throwing away image with pts 6591379 because it's too old (diff : 36585).
video_out: throwing away image with pts 6593127 because it's too old (diff : 34837).
video_out: throwing away image with pts 6594877 because it's too old (diff : 36924).
video_out: throwing away image with pts 6596629 because it's too old (diff : 35172).
video_out: throwing away image with pts 6598382 because it's too old (diff : 33419).
video_out: throwing away image with pts 6600137 because it's too old (diff : 35617).
video_out: throwing away image with pts 6601893 because it's too old (diff : 33861).
video_out: throwing away image with pts 6603651 because it's too old (diff : 32103).
video_out: throwing away image with pts 6605410 because it's too old (diff : 34372).
video_out: throwing away image with pts 6607171 because it's too old (diff : 32611).
video_out: throwing away image with pts 6608933 because it's too old (diff : 30849).
video_out: throwing away image with pts 6610696 because it's too old (diff : 33425).
video_out: throwing away image with pts 6612461 because it's too old (diff : 31660).
video_out: throwing away image with pts 6614227 because it's too old (diff : 29894).
video_out: throwing away image with pts 6615994 because it's too old (diff : 28417).
video_out: throwing away image with pts 6617762 because it's too old (diff : 30403).
video_out: throwing away image with pts 6619531 because it's too old (diff : 28634).
video_out: throwing away image with pts 6621301 because it's too old (diff : 31119).
video_out: throwing away image with pts 6623072 because it's too old (diff : 29348).
video_out: throwing away image with pts 6624844 because it's too old (diff : 27576).
video_out: throwing away image with pts 6626617 because it's too old (diff : 30004).
video_out: throwing away image with pts 6628391 because it's too old (diff : 28230).
video_out: throwing away image with pts 6630166 because it's too old (diff : 26455).
video_out: throwing away image with pts 6631942 because it's too old (diff : 28521).
video_out: throwing away image with pts 6633718 because it's too old (diff : 26745).
video_out: throwing away image with pts 6635495 because it's too old (diff : 24968).
video_out: throwing away image with pts 6637273 because it's too old (diff : 27389).
video_out: throwing away image with pts 6639052 because it's too old (diff : 25610).
video_out: throwing away image with pts 6640831 because it's too old (diff : 23831).
video_out: throwing away image with pts 6642611 because it's too old (diff : 26304).
video_out: throwing away image with pts 6644392 because it's too old (diff : 24523).
video_out: throwing away image with pts 6646173 because it's too old (diff : 22742).
video_out: throwing away image with pts 6647955 because it's too old (diff : 24899).
video_out: throwing away image with pts 6649738 because it's too old (diff : 23116).
video_out: throwing away image with pts 6651521 because it's too old (diff : 21333).
video_out: throwing away image with pts 6653305 because it's too old (diff : 23475).
video_out: throwing away image with pts 6655089 because it's too old (diff : 21691).
video_out: throwing away image with pts 6656874 because it's too old (diff : 19906).
video_out: throwing away image with pts 6658659 because it's too old (diff : 21875).
video_out: throwing away image with pts 6660445 because it's too old (diff : 20089).
video_out: throwing away image with pts 6662231 because it's too old (diff : 18303).
video_out: throwing away image with pts 6664018 because it's too old (diff : 20290).
video_out: throwing away image with pts 6665805 because it's too old (diff : 18503).
video_out: throwing away image with pts 6667593 because it's too old (diff : 16715).
video_out: throwing away image with pts 6669381 because it's too old (diff : 19521).
video_out: throwing away image with pts 6671169 because it's too old (diff : 17733).
video_out: throwing away image with pts 6672958 because it's too old (diff : 15944).
video_out: throwing away image with pts 6674747 because it's too old (diff : 18173).
video_out: throwing away image with pts 6676536 because it's too old (diff : 16384).
video_out: throwing away image with pts 6678326 because it's too old (diff : 14594).
video_out: throwing away image with pts 6680116 because it's too old (diff : 16708).
video_out: throwing away image with pts 6681907 because it's too old (diff : 14917).
video_out: throwing away image with pts 6683698 because it's too old (diff : 13126).
video_out: throwing away image with pts 6685489 because it's too old (diff : 15318).
video_out: throwing away image with pts 6687280 because it's too old (diff : 13527).
video_out: throwing away image with pts 6689072 because it's too old (diff : 11735).
video_out: throwing away image with pts 6690864 because it's too old (diff : 13971).
video_out: throwing away image with pts 6692656 because it's too old (diff : 12179).
video_out: throwing away image with pts 6694449 because it's too old (diff : 10386).
video_out: throwing away image with pts 6696242 because it's too old (diff : 13034).
video_out: throwing away image with pts 6698035 because it's too old (diff : 11241).
video_out: throwing away image with pts 6699828 because it's too old (diff : 9448).
200 frames delivered, 0 frames skipped, 145 frames discarded
video_out: throwing away image with pts 6701621 because it's too old (diff : 11694).
video_out: throwing away image with pts 6703415 because it's too old (diff : 9900).
video_out: throwing away image with pts 6705209 because it's too old (diff : 8106).
video_out: throwing away image with pts 6707003 because it's too old (diff : 10464).
video_out: throwing away image with pts 6708797 because it's too old (diff : 8670).
video_out: throwing away image with pts 6710591 because it's too old (diff : 6876).
video_out: throwing away image with pts 6712386 because it's too old (diff : 9203).
video_out: throwing away image with pts 6714181 because it's too old (diff : 7408).
video_out: throwing away image with pts 6715976 because it's too old (diff : 5613).
video_out: throwing away image with pts 6717771 because it's too old (diff : 7691).
video_out: throwing away image with pts 6719566 because it's too old (diff : 5896).
video_out: throwing away image with pts 6721362 because it's too old (diff : 4100).
video_out: throwing away image with pts 6723158 because it's too old (diff : 6377).
video_out: throwing away image with pts 6724954 because it's too old (diff : 4581).
video_out: throwing away image with pts 6726750 because it's too old (diff : 2785).
video_out: throwing away image with pts 6728546 because it's too old (diff : 5274).
video_out: throwing away image with pts 6730342 because it's too old (diff : 3478).
200 frames delivered, 0 frames skipped, 17 frames discarded

Mir ist noch etwas aufgefallen. Im Problemfall wird immer zuerst das video plugin geladen, und dann das audio plugin.

Source code

1
2
load_plugins: plugin vdpau_h264 will be used for video streamtype 4d.
load_plugins: plugin a/52 will be used for audio streamtype 00.

Mit patch ist das immer umgekehrt, zuerst audio, dann video.

Source code

1
2
3
load_plugins: plugin a/52 will be used for audio streamtype 00.
...
load_plugins: plugin vdpau_h264 will be used for video streamtype 4d.


Was das Starten des Abspielens betrifft, wäre es schön, dies richtig in Ordnung zu bringen, denn mein xine slow_system patch hat den Nachteil, dass das Abspielen gleich nach dem Starten eine knappe Sekunde auf Zeitlupe ohne Ton ist. Ist eben nur ein workaround.

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)

This post has been edited 3 times, last edit by "jrie" (Mar 31st 2011, 2:51pm)


13

Saturday, April 2nd 2011, 2:05am

Das Starten des Abspielens habe ich jetzt auch gelöst.
Der angehängte patch löst alle beschriebenen Probleme.
Kein dropped frames mehr beim Starten vom Abspielen, auch nicht bei Sprüngen oder nach schnellem Vorspulen etc.
Der patch für xine ist nicht mehr nötig.

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
--- dvbplayer.c.orig2010-03-07 15:24:26.000000000 +0100
+++ dvbplayer.c 2011-04-02 01:57:21.016535946 +0200
@@ -320,7 +320,7 @@
   if (nonBlockingFileReader)
  nonBlockingFileReader->Clear();
   if (!firstPacket) // don't set the readIndex twice if Empty() is called more than once
- readIndex = ptsIndex.FindIndex(DeviceGetSTC()) - 1;  // Action() will first increment it!
+ readIndex = ptsIndex.FindIndex(DeviceGetSTC());  // prevents dropped frames in xine vdpau h264
   delete readFrame; // might not have been stored in the buffer in Action()
   readFrame = NULL;
   playFrame = NULL;
@@ -388,6 +388,8 @@
   int pc = 0;

   readIndex = Resume();
+  int resume = readIndex;
+  bool firsttime = true;
   if (readIndex >= 0)
  isyslog("resuming replay at index %d (%s)", readIndex, *IndexToHMSF(readIndex, true, framesPerSecond));

@@ -452,6 +454,12 @@
                else if (index) {
                   uint16_t FileNumber;
                   off_t FileOffset;
+                  if (firsttime) {
+                    if (readIndex == (resume + 32)) {
+                    Goto((readIndex - 32));// prevents dropped frames in xine vdpau h264
+                    firsttime = false;
+                    }
+                  }
                   if (index->Get(readIndex + 1, &FileNumber, &FileOffset, &readIndependent, &Length) && NextFile(FileNumber, FileOffset))
                      readIndex++;
                   else
@@ -760,7 +768,7 @@
     if (Index > 0)
        Index = index->GetNextIFrame(Index, false, NULL, NULL, NULL, true);
     if (Index >= 0)
-       readIndex = Index - 1; // Action() will first increment it!
+       readIndex = Index; // prevents dropped frames in xine vdpau h264
     }
  Play();
  }

Bei mir funktioniert es mit dem patch bestens, ich kann fünf HD Sender gleichzeitig aufnehmen (mehr habe ich nicht gleichzeitig), und während dessen durch die laufenden Aufnahmen zappen, ohne irgendwelche Störungen. Ohne den patch gab es besonders bei laufenden HD Aufnahmen Probleme beim Zappen durch HD Aufnahmen (framedrops, continuity errors, Störungen in Aufnahmen, starke Verzögerungen, längere Cpu Vollauslastung).

Ich bitte alle Tester um Feedback.
jrie has attached the following file:
  • dvbplayer.c.diff (1.83 kB - 38 times downloaded - latest: Apr 11th 2014, 2:38am)

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)

This post has been edited 4 times, last edit by "jrie" (Apr 2nd 2011, 2:18pm)


sgp01

Beginner

Posts: 35

Location: Wien

  • Send private message

14

Tuesday, April 5th 2011, 8:17pm

Nur zur info: So ganz kompatibel mit dem Jumpplay Patch dürfte dieser Patch nicht sein. Vielleicht hast ja Zeit das bei Gelegenheit mal anzupassen ...

Source code

1
2
3
4
5
6
g++ -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses -c -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -DUSE_TTXTSUBS -DUSE_WAREAGLEICON -DUSE_YAEPG -DUSE_JUMPPLAY -DREMOTE_KBD -DREMOTE_LIRC -DLIRC_DEVICE=\"/dev/lircd\" -DRCU_DEVICE=\"/dev/ttyS1\" -D_GNU_SOURCE -DVIDEODIR=\"/video\" -DCONFDIR=\"/video\" -DPLUGINDIR=\"./PLUGINS/lib\" -DLOCDIR=\"./locale\" -I/usr/include/freetype2   -I/usr/src/v4l-dvb/linux/include dvbplayer.c
dvbplayer.c: In member function ‘virtual void cDvbPlayer::Action()’:
dvbplayer.c:433: error: ‘LastMarkPause’ was not declared in this scope
dvbplayer.c:524: error: ‘cutIn’ was not declared in this scope
dvbplayer.c:599: error: ‘LastMarkPause’ was not declared in this scope
make: *** [dvbplayer.o] Fehler 1
Mein VDR: Software: vdr 1.7.30 vdr-xine, xine-lib-1.2, Ubuntu 10.04, 2.6.35 Hardware: GT 220, TT-PCI S2-1600 + Mystique SaTiX-S2 V2

15

Thursday, April 7th 2011, 3:39pm

Ja, die setzten beide an derselben Stelle in Action() an.
Da ich den Jumpplay Patch nicht verwende, und dieser komplexer als mein Patch ist, wäre es mir lieber, wenn ein Jumpplay Patch Benutzer (bei Bedarf) meinen Patch integriert.

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)

gda

Im Forum Zuhause

Posts: 12,768

Location: HH

  • Send private message

16

Thursday, April 7th 2011, 3:57pm

Nur zur info: So ganz kompatibel mit dem Jumpplay Patch dürfte dieser Patch nicht sein. Vielleicht hast ja Zeit das bei Gelegenheit mal anzupassen ...

g++ -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses -c -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -DUSE_TTXTSUBS -DUSE_WAREAGLEICON -DUSE_YAEPG -DUSE_JUMPPLAY -DREMOTE_KBD -DREMOTE_LIRC -DLIRC_DEVICE=\"/dev/lircd\" -DRCU_DEVICE=\"/dev/ttyS1\" -D_GNU_SOURCE -DVIDEODIR=\"/video\" -DCONFDIR=\"/video\" -DPLUGINDIR=\"./PLUGINS/lib\" -DLOCDIR=\"./locale\" -I/usr/include/freetype2 -I/usr/src/v4l-dvb/linux/include dvbplayer.c
dvbplayer.c: In member function ‘virtual void cDvbPlayer::Action()’:
dvbplayer.c:433: error: ‘LastMarkPause’ was not declared in this scope
dvbplayer.c:524: error: ‘cutIn’ was not declared in this scope
dvbplayer.c:599: error: ‘LastMarkPause’ was not declared in this scope
make: *** [dvbplayer.o] Fehler 1

Das verstehe ich nicht. Jries Patch benutzt diese Variablen nicht, noch löscht er die Deklarationen dafür. Ich denke du hast die Patches nicht richtig gemerged. Außerdem ist es nicht Aufgabe von jrie mit seinem Patch Rücksicht auf andere Patches zu nehmen. Das ist Sache desjenigen, der die Patches zusammenführt. Ein Patch-Entwickler muss immer gegen den Vanilla-VDR patchen.

Dank an jrie für seinen Beitrag!

Gerald

OrigenAE S16T, ASRock K10N78D, Athlon II X2 4400e (unlocked Sempron 140), 2GB RAM, OCZ Vertex 30GB, 2xWD10EADS, 3xKNC One TV-Station DVB-C, G210 MSI N210-MD512H, yaVDR.
Seagate Dockstar, Debian Squeeze, VDR 1.7.16, 500 GB 2,5" HD, 2xSundtek MediaTV Home DVB-C/T.

17

Saturday, April 9th 2011, 1:35am

Der Preis für die niedrige Cpu Last beim Starten vom Abspielen ist eine gewisse Verzögerung. Ohne Patch ist es schneller. Daher habe ich das Verhalten jetzt konfigurierbar gemacht. Ohne laufende Aufnahmen lieber schnell, mit laufenden Aufnahmen lieber sicher.

Mit vdr-xine funktioniert das bei mir sehr gut. Bei einem Test mit xineliboutput hat es nicht so viel gebracht.

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
diff -Nru vdr-1.7.17-orig/config.c vdr-1.7.17/config.c
--- vdr-1.7.17-orig/config.c	2010-06-06 12:06:43.000000000 +0200
+++ vdr-1.7.17/config.c 2011-04-09 01:18:30.825507970 +0200
@@ -392,6 +392,7 @@
   MultiSpeedMode = 0;
   ShowReplayMode = 0;
   ResumeID = 0;
+  CpuLowXine = 0;
   CurrentChannel = -1;
   CurrentVolume = MAXVOLUME;
   CurrentDolby = 0;
@@ -583,6 +584,7 @@
   else if (!strcasecmp(Name, "MultiSpeedMode"))  	MultiSpeedMode 	= atoi(Value);
   else if (!strcasecmp(Name, "ShowReplayMode"))  	ShowReplayMode 	= atoi(Value);
   else if (!strcasecmp(Name, "ResumeID"))        	ResumeID       	= atoi(Value);
+  else if (!strcasecmp(Name, "CpuLowXine"))      	CpuLowXine     	= atoi(Value);
   else if (!strcasecmp(Name, "CurrentChannel"))  	CurrentChannel 	= atoi(Value);
   else if (!strcasecmp(Name, "CurrentVolume"))   	CurrentVolume  	= atoi(Value);
   else if (!strcasecmp(Name, "CurrentDolby"))    	CurrentDolby   	= atoi(Value);
@@ -679,6 +681,7 @@
   Store("MultiSpeedMode", 	MultiSpeedMode);
   Store("ShowReplayMode", 	ShowReplayMode);
   Store("ResumeID",       	ResumeID);
+  Store("CpuLowXine",     	CpuLowXine);
   Store("CurrentChannel", 	CurrentChannel);
   Store("CurrentVolume",  	CurrentVolume);
   Store("CurrentDolby",   	CurrentDolby);
diff -Nru vdr-1.7.17-orig/config.h vdr-1.7.17/config.h
--- vdr-1.7.17-orig/config.h	2010-10-24 13:22:35.000000000 +0200
+++ vdr-1.7.17/config.h 2011-04-09 01:18:53.603507970 +0200
@@ -284,6 +284,7 @@
   int MultiSpeedMode;
   int ShowReplayMode;
   int ResumeID;
+  int CpuLowXine;
   int CurrentChannel;
   int CurrentVolume;
   int CurrentDolby;
diff -Nru vdr-1.7.17-orig/dvbplayer.c vdr-1.7.17/dvbplayer.c
--- vdr-1.7.17-orig/dvbplayer.c 2010-03-07 15:24:26.000000000 +0100
+++ vdr-1.7.17/dvbplayer.c  	2011-04-09 01:19:08.907507971 +0200
@@ -15,6 +15,7 @@
 #include "ringbuffer.h"
 #include "thread.h"
 #include "tools.h"
+#include "config.h"

 // --- cPtsIndex -------------------------------------------------------------

@@ -319,8 +320,12 @@
   LOCK_THREAD;
   if (nonBlockingFileReader)
  	nonBlockingFileReader->Clear();
-  if (!firstPacket) // don't set the readIndex twice if Empty() is called more than once
- 	readIndex = ptsIndex.FindIndex(DeviceGetSTC()) - 1;  // Action() will first increment it!
+  if (!firstPacket) { // don't set the readIndex twice if Empty() is called more than once
+ 	if (!Setup.CpuLowXine)
+    	readIndex = ptsIndex.FindIndex(DeviceGetSTC()) - 1;  // Action() will first increment it!
+ 	else
+    	readIndex = ptsIndex.FindIndex(DeviceGetSTC());  // prevents dropped frames in xine vdpau h264
+  }
   delete readFrame; // might not have been stored in the buffer in Action()
   readFrame = NULL;
   playFrame = NULL;
@@ -388,6 +393,8 @@
   int pc = 0;

   readIndex = Resume();
+  int resume = readIndex;
+  bool firsttime = true;
   if (readIndex >= 0)
  	isyslog("resuming replay at index %d (%s)", readIndex, *IndexToHMSF(readIndex, true, framesPerSecond));

@@ -452,6 +459,14 @@
                	else if (index) {
                   	uint16_t FileNumber;
                   	off_t FileOffset;
+                  	if (Setup.CpuLowXine) {
+                    	if (firsttime) {
+                      	if (readIndex == (resume + 32)) {
+                      	Goto((readIndex - 32));// prevents dropped frames in xine vdpau h264
+                      	firsttime = false;
+                      	}
+                    	}
+                  	}
                   	if (index->Get(readIndex + 1, &FileNumber, &FileOffset, &readIndependent, &Length) && NextFile(FileNumber, FileOffset))
                      	readIndex++;
                   	else
@@ -760,7 +775,10 @@
     	if (Index > 0)
        	Index = index->GetNextIFrame(Index, false, NULL, NULL, NULL, true);
     	if (Index >= 0)
-       	readIndex = Index - 1; // Action() will first increment it!
+       	if (Setup.CpuLowXine)
+         	readIndex = Index; // prevents dropped frames in xine vdpau h264
+       	else
+         	readIndex = Index - 1; // Action() will first increment it!
     	}
  	Play();
  	}
diff -Nru vdr-1.7.17-orig/menu.c vdr-1.7.17/menu.c
--- vdr-1.7.17-orig/menu.c  	2011-02-27 13:37:48.000000000 +0100
+++ vdr-1.7.17/menu.c   2011-04-09 01:19:25.585507971 +0200
@@ -3080,6 +3080,7 @@
   Add(new cMenuEditBoolItem(tr("Setup.Replay$Multi speed mode"), &data.MultiSpeedMode));
   Add(new cMenuEditBoolItem(tr("Setup.Replay$Show replay mode"), &data.ShowReplayMode));
   Add(new cMenuEditIntItem(tr("Setup.Replay$Resume ID"), &data.ResumeID, 0, 99));
+  Add(new cMenuEditBoolItem(tr("Setup.Replay$Keep Cpu Low in Xine"), &data.CpuLowXine));
 }

 void cMenuSetupReplay::Store(void)
jrie has attached the following file:
  • CpuLowXine.diff (4.84 kB - 28 times downloaded - latest: Apr 10th 2014, 3:30pm)

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)

This post has been edited 2 times, last edit by "jrie" (Apr 13th 2011, 1:18pm)


18

Friday, July 22nd 2011, 12:09pm

Weitere Verbesserung nur mit schnellerer Hardware

Ist es möglich, die Verzögerung oder die 100% Cpu Phase mit leichtem Ruckeln durch die dropped frames loszuwerden?
Eine gründlichere Analyse hat Folgendes ergeben. Nach einem Sprung werden die ersten Bilder vom Decoder verzögert angeliefert. Dies führt in der video_out loop zu einer hohen Cpu-Last. Dies führt aber wiederum dazu, dass hereinkommende Bilder zu spät verarbeitet werden. Dies hält die Cpu-Last oben, und so weiter.
Optimierungsversuche bei der Verarbeitung zu später Bilder haben nicht genug gebracht, sodass ich jetzt auf ein AM3 Board mit zu 2 Kernen freigeschaltetem Sempron 140 umgestiegen bin. Damit wird das Abspielen nach einem Sprung praktisch sofort fließend fortgesetzt, sogar mit der PCI-Karte 8400 GS. Den Pentium 3 Rechner benutze ich jetzt nur noch für DVB-T, die SD-Auflösung packt er problemlos.

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)

19

Friday, April 13th 2012, 1:53pm

Mit dem softhddevice plugin treten diese Probleme nicht auf.
Für ältere langsame Hardware ist Softhddevice also sehr empfehlenswert.

Mein VDR

Asrock M3A770DE, Sempron 140 @ DualCore, 3 x TT S2-1600, GT520
openSuse 13.1 64bit, Kernel 3.12.17 + BER/UNC-Patch für stv090x, nvidia 334.21, vdr 2.1.6 mit Patchen (checkts, naludump, statusleds, ...)