Auflösung aus Stream ermitteln

  • Wenn jemand Code für das Auslesen der tatsächlichen Auflösung liefert könnte ich mir auch vorstellen, das als eigenes Feld in die info-Datei aufzunehmen.

    Prinzipiell hat der VDR die Info ja schon, zumindest für H.264- (und damit auch H.265-) Streams, aber wertet sie bisher nicht aus.

    Mit dbgframes() konnte ich das verifizieren: /AB/AB/AB/A*H264: 1280 x 720*SI/AB/AB/AB/AB/AB/AB/AB

    Ich habe nur keine Idee, wie man die Daten aus cH264Parser in die Info Datei bringen kann ....


    zum Aux-Feld: Es gab doch mal die (unverbindliche) Vereinbarung, dass jedes Plugin seine Daten in xml-Tags verpackt, z.B.

    @ <epgsearch><channel>1 - Das Erste HD</channel><searchtimer>Spielfilm</searchtimer>......</epgsearch>

    Das klappt ja auch gut

  • in cH264Parser::ParseSequenceParameterSet() wird in den Zeilen 1504/1505 der Wert ausgelesen:

    http://git.tvdr.de/?p=vdr.git;…bfa246ccfcc;hb=HEAD#l1504


    Der muss dann noch etwas angepasst werden:

    Code
    1. int width = 16*(1+GetGolombUe()); // pic_width_in_mbs_minus1
    2. int height = 16*(1+GetGolombUe()); // pic_height_in_map_units_minus1
    3. frame_mbs_only_flag = GetBit(); // frame_mbs_only_flag
    4. if (!frame_mbs_only_flag) {
    5. height = 2*height;
    6. GetBit(); // mb_adaptive_frame_field_flag
    7. }
    8. dbgframes("*H264: %d x %d %c*", width, height, frame_mbs_only_flag? 'p':'i');

    Damit bekomme ich dann schon mal "1270x720 p" und "1920x1088 i" angezeigt :-)

    Was noch fehlt ist die Auswertung der 4 frame_crop_*_offsets, da bin ich dran, damit müssten die 1088 zu 1080 werden.

    H.265 scheint auch noch nicht zu gehen und MPEG2 funktioniert sowieso ganz anders.

  • HowTo: APT pinning

    The post was edited 1 time, last by fnu ().

  • Fürs Protokoll: falls ich das einbaue, wird es nur für Aufnahmen geschehen, nicht für Live-TV. Bei Live-TV wird der Datenstrom vom Empfangsdevice zum Wiedergabedevice einfach "durchgereicht", ohne groß in die Daten reinzuschauen. Ausgabedevices werden also auf jeden Fall diese Info selber extrahieren können müssen, falls sie sie benötigen.

  • Bei Live-TV wird der Datenstrom vom Empfangsdevice zum Wiedergabedevice einfach "durchgereicht", ohne groß in die Daten reinzuschauen.

    Das habe ich gemerkt, weil dbgframes() nur beim Aufnehmen etwas ausgibt ;-) bei Live-TV werden die Parser erst gar nicht aufgerufen.


    Ich habe die Auswertung von MPEG2 implementiert und die Auswertung auf den jeweils ersten Aufruf beschränkt.

    Außerdem gibt's in cFrameParser zwei Funktionen zur Abfrage. Die könnte man in cFrameDetector nutzen wenn framesPerSecond gesetzt wird, da offenbar die Auflösung immer vor der Framerate bestimmt wird.

    Getestet habe ich bisher die Formate 1920x1080, 1280x720, 720x576, 480x576, 1280x1080.

    Da für H.265 ein zusätzlicher SPS Parser notwendig ist würde ich gerne wissen, ob das aufgenommen wird bevor ich das umsonst programmiere.

  • Außerdem gibt's in cFrameParser zwei Funktionen zur Abfrage. Die könnte man in cFrameDetector nutzen wenn framesPerSecond gesetzt wird, da offenbar die Auflösung immer vor der Framerate bestimmt wird.

    Das verstehe ich nicht. Was hat die Auflösung mit der Framerate zu tun?

    Da für H.265 ein zusätzlicher SPS Parser notwendig ist würde ich gerne wissen, ob das aufgenommen wird bevor ich das umsonst programmiere.

    Na ja, wenn wir das Speichern der Auflösung einbauen, dann für alle unterstützten Formate. Ich hoffe mal, dass das nicht zu viel zusätzlicher Code wird. Einen cH265Parser gibt es ja bereits - ist die Auflösung bei H265 wirklich so gut "versteckt"?

  • So wie ich die Klassen verstehe, bekommt RecordingInfo die framesPerSecond von cFrameDetector und hat keinen direkten Zugriff auf die Parser. Deshalb dachte ich man kann das dort einbauen, aber vielleicht hast Du ja ne bessere Idee - in dem Teil des VDR kenne ich mich nicht wirklich aus. So wie ich das aus den dbgframes-Meldungen erkenne, wird immer erst die Auflösung ermittelt bevor die framesPerSecond bestimmt sind, so dass man zu dem Zeitpunkt wenn framesPerSecond vorliegt auch davon ausgehen kann, dass die Auflösung bekannt ist und dann von cParser in cFrameDetector übernehmen kann.


    Ich hatte Deine Aussage oben "Falls ich das einbaue..." so verstanden, dass es noch nicht sicher ist. Wenn es reinkommt macht es natürlich nur Sinn, wenn die Info für alle Codecs vorliegt.

    Ich hatte zuerst gedacht, dass H.265 sehr ähnlich zu H.264 ist, da cH265Paraser von cH264Parser abgeleitet ist, aber das SequenceParameterSet ist komplett anders aufgebaut, so dass ein eigene Funktion dafür notwendig ist. Und im Gegensatz zu H264 gibts für H265 bisher noch kein ParseSequenceParamterSet()

  • Fürs Protokoll: falls ich das einbaue, wird es nur für Aufnahmen geschehen, nicht für Live-TV. Bei Live-TV wird der Datenstrom vom Empfangsdevice zum Wiedergabedevice einfach "durchgereicht", ohne groß in die Daten reinzuschauen. Ausgabedevices werden also auf jeden Fall diese Info selber extrahieren können müssen, falls sie sie benötigen.

    Vielleicht kann man die Funktionen ja so im Code ablegen, dass Plugins sie wiederverwenden können, wenn sie das für LiveTV brauchen?

  • Getestet habe ich bisher die Formate 1920x1080, 1280x720, 720x576, 480x576, 1280x1080.

    720x576 und 480x576 gibt es ja in 4:3 und 16:9.

    Aspectratio wäre also auch noch wichtig, mit der Auflösung allein weiss man noch nicht wie man das darstellen soll.


    Und ob es Interlaced ist oder nicht sollte vielleicht auch noch rein. (Ausgestorben ist das trotz HD ja leider immer noch nicht.)

    Gruss
    SHF