AVIA-restart: Movieplayer-AC3-Pause/Sprung-16:9-Problem

Sklaventreiber
Günther
Developer
Beiträge: 587
Registriert: Freitag 9. September 2005, 21:48

AVIA-restart: Movieplayer-AC3-Pause/Sprung-16:9-Problem

Beitrag von Günther »

Das Problem habe ich hier http://tuxbox-forum.dreambox-fan.de/for ... hp?t=42536 schon mal beschrieben, es tritt mit meiner Sagem und orginal Treibern auf (andere weiss ich nicht). Bei einem Film mit Ac3 und einem 16:9 Fernseher ist das Seitenverhältnis nach einem Sprung oder Pause nicht mehr in Ordnung .
Im log erscheint dann folgendes:

Code: Alles auswählen

avia_av: status timeout - chip didn't accept command 0x231
avia_av_event: $Id: avia_av_event.c,v 1.11 2003/10/26 16:32:51 obi Exp $
Anscheinend startet der AVIA neu und verliert die DisplayFormat Information (steht dann per default auf 4:3). Wenn ich das 16:9 Format mit VIDEO_SET_DISPLAY_FORMAT wieder einstelle paßt wieder alles.

Hat jemand eine Idee oder weiss wo man anfangen soll zum suchen? Der AVIA ist für mich absolutes Neuland :cry:

Theoretisch könnte man einen workaround in den Movieplayer einbauen (DisplayFormat neu senden bei Sprung und bei 16:9), aber das ist ja immer nur die zweitbeste Lösung ....
gmo18t
Erleuchteter
Erleuchteter
Beiträge: 553
Registriert: Freitag 27. Februar 2004, 14:30

Beitrag von gmo18t »

Hi,

im MP wird zyklisch das Seitenverhältnis (aspect) überprüft (Name der Funktion weiß ich im Augenblick nicht mehr). Dabei wird mit dem ioctl "VIDEO_GET_SIZE" das Seitenverhältnis aus dem mpeg stream (so wie's dort im Header steht, glaub ich) ausgelesen. Wenn diese dann von der aktuellen Einstellung abweicht, wird mit dem ioctl "VIDEO_SET_DISPLAY_FORMAT" das Seitenverhältnis entspr. umgeschaltet.

Das wurde implementiert um während des Playbacks einen Wechsel des Seitenverhältnisses korrekt nachzujustieren.

Die aktuelle Einstellung wird nur bei Filmstart gemerkt, so daß wenn durch irgendein AVIA-Reset das Bildformat "verloren geht", kein Wechsel des Seitenverhältnisses mehr erkannt bzw. der "VIDEO_SET_DISPLAY_FORMAT" ioctl nicht aufgerufen wird, weil aus dem Streamheader ja immer noch der selbe Wert ausgelesen wird, wie beim Filmstart ! Es sei denn, im Stream würde wirklich ein anderes Seitenverhältnis auftauchen...

- GMo -
Carjay
Developer
Beiträge: 122
Registriert: Sonntag 23. April 2006, 12:37

Re: AVIA-restart: Movieplayer-AC3-Pause/Sprung-16:9-Problem

Beitrag von Carjay »

Günther hat geschrieben:

Code: Alles auswählen

avia_av: status timeout - chip didn't accept command 0x231
avia_av_event: $Id: avia_av_event.c,v 1.11 2003/10/26 16:32:51 obi Exp $
Der Avia reagiert nicht mehr auf das "SelectStream" Kommando. Das bedeutet vermutlich, daß die Avia-Firmware abgestürzt ist. In dem Fall wird er dann resettet und neu gestartet, dabei werden die Parameter eben wieder auf ihren Default gesetzt.

Frage ist natürlich, warum er abstürzt bzw. nicht mehr reagiert. Hmm.
Günther
Developer
Beiträge: 587
Registriert: Freitag 9. September 2005, 21:48

Beitrag von Günther »

Sofern das eigentliche Problem im AVIA treiber nicht gefunden wird, würde ich erst einmal folgenden Workaround vorschlagen:
Movieplayer.cpp

Code: Alles auswählen

void checkAspectRatio (int vdec, bool init)
{

    static video_size_t size;
    static time_t last_check=0;

    // only necessary for auto mode, check each 5 sec. max
    if(!init && time(NULL) <= last_check+5)
        return;

    if(g_settings.video_Format == 1 && currentac3 == true) // Display format 16:9
    {
       // Workaround for 16:9/AC3/PAUSE/PLAY problem
        // AVIA does reset on Jump/pause with Ac3 and 16:9 Display.It loose the display format information, which is set to default (4:3)
        // We set the display format to the correct value cyclic
        // This issue might be better fixed in the AVIA itself ... sometime   ... if somebody knows how ...
        ioctl(vdec, VIDEO_SET_DISPLAY_FORMAT, VIDEO_CENTER_CUT_OUT);
        last_check=time(NULL);
    }
    else if(g_settings.video_Format == 0 )//Display format auto
    {
        if(init)
        {
            if(ioctl(vdec, VIDEO_GET_SIZE, &size) < 0)
                perror("[movieplayer.cpp] VIDEO_GET_SIZE");
            last_check=0;
        }
        else
        {
            video_size_t new_size;
            if(ioctl(vdec, VIDEO_GET_SIZE, &new_size) < 0)
                perror("[movieplayer.cpp] VIDEO_GET_SIZE");
            if(size.aspect_ratio != new_size.aspect_ratio)
            {
                printf("[movieplayer.cpp] AR change detected in auto mode, adjusting display format\n");
                video_displayformat_t vdt;
                if(new_size.aspect_ratio == VIDEO_FORMAT_4_3)
                    vdt = VIDEO_LETTER_BOX;
                else
                    vdt = VIDEO_CENTER_CUT_OUT;
                if(ioctl(vdec, VIDEO_SET_DISPLAY_FORMAT, vdt))
                    perror("[movieplayer.cpp] VIDEO_SET_DISPLAY_FORMAT");
                memcpy(&size, &new_size, sizeof(size));
            }
            last_check=time(NULL);
        }
    }
}
getestet mit sagem (Orginal ucodes)
Wenn keiner was dagegen hat würde ich das dieses WE mal einchecken

Günther
Günther
Developer
Beiträge: 587
Registriert: Freitag 9. September 2005, 21:48

Beitrag von Günther »

So, habe das mal eben eingescheckt. Falls es Probleme gibt einfach mal reporten. Der Workaround wirkt z.Z nur bei AC3 und 16:9 Display. Bei Bedarf könnte der Workaround auch auf nicht-Ac3 ausgeweitet werden.
(Der Workaround könnte allerdings auch auf bestimmte Events wie Sprung/Pause beschränkt werden. Am besten wäre es natürlich ein Event vom Avia Treiber würde das regeln, dann könnte man auf das Pollen verzichten. Kennt sich da jemand aus?)