AVIA Programmierung (über DVB-API)

gmo18t
Erleuchteter
Erleuchteter
Beiträge: 553
Registriert: Freitag 27. Februar 2004, 14:30

AVIA Programmierung (über DVB-API)

Beitrag von gmo18t »

Hi,

kann mir vielleicht jemand detailiertere Infos zum DVB API Kommando "AUDIO_SET_AV_SYNC",
das per ioctl an's audio device gesendet werden kann, geben.

Beim Erforschen der "dbox drivers" konnte ich mir leider kein ausreichendes Bild über die genaue
Funktionalität dieses Kommandos machen, da letztendlich in avia_av_core.c nur ein
"avia_av_dram_write()" mit entsprechendem Wert (AVIA_AV_SYNC_MODE_AV) abgesetzt wird.

Klar ist, daß dies nur passiert, wenn mindestens ein device (audio/video) im "PLAY"-Zustand ist.
Mich interessiert aber, wie die Synchronistaion vonstatten geht, wenn ein TS stream (im SPTS)
abgespielt wird und es durch stream fehler zu einer Asynchronität kommt -> Warum kann diese
nicht mehr ausgeglichen werden. Ist der "AV_SYNC" Modus nicht dazu da, dies in einem gewissen
Rahmen (wenn ja, wie groß) wieder auszugleichen ?

Weiterhin sind mir noch die Werte AVIA_AV_SYNC_MODE_AUDIO und AVIA_AV_SYNC_MODE_VIDEO
in's Auge gefallen, die aber per DVB API nicht wählbar sind. Wäre damit ein anderes Verhalten der
Devices zu erwarten, und wenn ja welches ?

Hintergrund ist, daß beim Abspielen von "livestreams" (mit modifizierten movieplayer) und dem Auftreten
von stream Fehlern, Audio und Video asynchron werden.
Bisher her habe ich das durch folgendes Coding - ausgelöst per Fernbedienungstaste - behoben

Code: Alles auswählen

...
  //-- stop DMX devices --
  ioctl(ctx->dmxv, DMX_STOP);
  ioctl(ctx->dmxa, DMX_STOP);

  //-- stop AV devices --
  ioctl(ctx->vdec, VIDEO_STOP);
  ioctl(ctx->adec, AUDIO_STOP);

  //-- setup DMX devices (again) --
  ctx->p.input    = DMX_IN_DVR;
  ctx->p.output   = DMX_OUT_DECODER;
  ctx->p.flags    = 0; 
  ctx->p.pid      = ctx->pida;
  ctx->p.pes_type = DMX_PES_AUDIO;
  ioctl (ctx->dmxa, DMX_SET_PES_FILTER, &(ctx->p));

  ctx->p.pid      = ctx->pidv;
  ctx->p.pes_type = DMX_PES_VIDEO;
  ioctl (ctx->dmxv, DMX_SET_PES_FILTER, &(ctx->p));

  //-- start AV devices again --
  if (ctx->ac3 == 1) 
    ioctl(ctx->adec, AUDIO_SET_BYPASS_MODE,0UL);
  else
    ioctl(ctx->adec, AUDIO_SET_BYPASS_MODE,1UL);

  ioctl(ctx->adec, AUDIO_PLAY);             // audio
  ioctl(ctx->vdec, VIDEO_PLAY);             // video
  ioctl(ctx->adec, AUDIO_SET_AV_SYNC, 1UL)

  //-- start DMX devices (again) --
  ioctl(ctx->dmxa, DMX_START);  // audio first ?!
  ioctl(ctx->dmxv, DMX_START);
...
Dies geht natürlich mit einer deutlich bemerkbaren Unterbrechung des Abspielvorgangs einher und ist
maximal unkomfortabel.
Ich suche aber eine Lösung, die z.B. alle 10 Sekunden automatisch resynchronisiert ohne bemerkbare
Unterbrechung. Vielleicht hilft mir ja ein wenig weiter, wenn ich mehr über die Eigenschaften/Besonderheiten
der AVIAs wüßte ...
Weiß ja, daß über diesen Chip nix an Doku zu bekommen ist, aber die bisher angefallenen Erfahrungen
damit sind bestimmt auch schon recht aufschlußreich.

Wäre prima, wenn sich jemand mit dieser Materie etwas besser auskennen würde und mir ein paar
nützliche Infos dazu geben könnte.

- GMo -
Npq
Senior Member
Beiträge: 1339
Registriert: Donnerstag 24. April 2003, 12:12

Beitrag von Npq »

Was da genau passiert wußte wohl nur C-Cube.

none = gar nichts gesynct
Video = sync nur Video
Audio = sync nur Audio
AV = sync sowohl Video als auch Audio.

Die von dir angesprochenen Punkte habe ich mich auch schon gefragt. Das sind aber Dinge, die in der Avia-Firmware passieren.

Genauso warum die Firmware manchmal einfach aufhört zu dekodieren, obwohl sie angeblich Fehlererkennung etc. beherrscht.

Das ist so, als wenn dann die Firmware abstürzt und nicht mehr wieder korrekt startet. Der Demux schreibt dann nach wie vor die Daten in die Queue.

Debugüberlegungen meinerseits beziehen leider immer die Firmware vom Avia mit ein, nur die ist eine Black Box, also kann man da nicht ansetzen.

Das hat mir auch die Lust genommen, da weiter zu probieren.