Skip to content

Releases: jopsis/InputStreamPlayer

v0.9.28

Choose a tag to compare

@jopsis jopsis released this 12 Oct 08:19
  • Un perfil Dolby Vision 5 se ve morado y verdoso con ExoPlayer en una Bravia
    VH21 y bien con mpv, sin que el log diga si la tele anuncia Dolby Vision
    («BRAVIA 4K VH21» es una plataforma compartida por modelos con y sin él). El
    encabezado del registro lleva ahora «Pantalla:» (tipos HDR que declara, la
    misma consulta que usa ExoPlayer para elegir decodificador) y «Decodificadores
    Dolby Vision:» con los perfiles de cada uno.
  • Prueba: con ExoPlayer, si el vídeo es HDR o Dolby Vision la ventana pide
    COLOR_MODE_HDR (y lo deja en el de siempre al salir), por si la tele no
    entraba en su modo HDR con el decodificador Dolby Vision. La Sony
    XR-75X90K sí anuncia Dolby Vision; no hay certeza de que ésta sea la causa.
    Compila; sin probar en aparato (no hay esa Bravia a mano).

v0.9.27

Choose a tag to compare

@jopsis jopsis released this 12 Oct 05:31
  • Un usuario con una Bravia VH21 veía mal los colores de una película con
    ExoPlayer y bien con mpv. El registro no decía nada: en producción ExoPlayer
    no escribía el decodificador ni el formato, solo en depuración. Ahora, al
    abrir el vídeo, deja en el registro el decodificador elegido y el formato
    (códec, tamaño, bitrate y primarios/transferencia/rango de color). No cambia
    la reproducción; solo sirve para diagnosticar el siguiente log. Lo único que
    se sabía de la película por el lado de mpv: H.264 1080p SDR, BT.709, rango
    limitado, con OMX.MTK.VIDEO.DECODER.AVC.

v0.9.26

Choose a tag to compare

@jopsis jopsis released this 11 Oct 19:59

Aviso de un usuario de Apple TV.

  • Preferencias: la pantalla no tenía desplazamiento vertical y no cabía:
    empezaba a media tarjeta de OpenGL/Sistema y no bajaba de «Red». Ahora va en
    un ScrollView.
  • Fuentes y Guías EPG: el foco de tvOS solo baja a lo que tiene justo
    debajo, y bajo «Cerrar» o el campo del nombre no había nada enfocable (el
    icono de la tarjeta, el título de la fila). Cabecera, tarjeta de añadir y
    cada fila son ahora focusSection: desde cualquier botón se baja y se sube.
  • Guía: desde «Antes» no se bajaba a la rejilla (debajo están los nombres
    de los canales); ahora sí. La guía abre con el foco en lo que se emite en el
    primer canal en vez de en «Cerrar». La franja pasa de cuatro a dos horas,
    como en iPad y Android, y la rejilla llega al borde de abajo en vez de
    cortarse a media fila dejando una franja libre.
  • --ui-testing-show-guide-sources abre la gestión de guías para pruebas.
  • Probado en el simulador de Apple TV 4K pulsando el mando desde un test de
    interfaz (XCUIRemote); no en un Apple TV real.

v0.9.25

Choose a tag to compare

@jopsis jopsis released this 11 Oct 11:07
  • Un MKV Dolby Vision perfil 7 (dvhe.07.06, el de los UHD) en una Shield:
    el aviso de la 0.9.24 saltó bien («el aparato no decodifica»), pero se
    puede ver. DolbyVisionCompat envuelve los extractores de archivos y, si
    ningún decodificador Dolby Vision del aparato admite el perfil 7, presenta
    la pista como HEVC: el decodificador HEVC reproduce la capa base (HDR10) e
    ignora la de mejora. Sin muestra de perfil 7 a mano: comprobado solo que MP4
    y MKV normales siguen abriendo.

v0.9.24

Choose a tag to compare

@jopsis jopsis released this 11 Oct 09:13
  • Cierre al cambiar de motor (Android, desde 0.9.22): la superficie de
    vídeo no se recreaba al pasar de ExoPlayer a MPV (o al revés), así que el
    motor nuevo no tenía dónde pintar y mpv abortaba
    (vo_mediacodec_embed: WinID != 0), visto en una Bravia. Ahora hay una
    superficie por reproductor (key(player)). Probado en un OnePlus 7 Pro en
    los dos sentidos.
  • ExoPlayer sin imagen: Dolby Vision o AV1 que el decodificador del aparato
    no puede («excede sus capacidades») fallan al momento con el aviso de probar
    el otro motor; y si hay vídeo en el búfer pero ninguna imagen en 20 s,
    también (visto en una Shield con Dolby Vision perfil 10 sobre AV1, que se
    quedaba cargando sin decir nada).
  • Sin decodificadores libres (multiview en una Bravia, que solo tiene dos):
    el mensaje lo dice en vez de «el aparato no sabe decodificar este vídeo».
  • Núcleo: si el alimentador de un Smooth falla (un 412 al empezar), se
    cierra el flujo; antes el reproductor se quedaba esperando para siempre sin
    reconectar ni avisar.
  • ISML en directo con ExoPlayer (OnePlus 7 Pro): tardaba ~50 s en arrancar
    (mpv, 9 s) y luego se paraba cada minuto. Tres causas, todas del lado de
    ExoPlayer: el ajustador de tiempos compartido por vídeo y audio (ahora uno
    por flujo: el núcleo ya los hace empezar en el mismo punto, medido a 9 ms);
    el control de búfer, que no sabía cuánto llevaba y esperaba a llenarlo
    (ahora arranca en cuanto hay datos); y el lector progresivo, que se detenía
    cada 1 MB a esperar permiso y frenaba al alimentador (ahora no se detiene).
    Medido: arranca en 0,7 s y sin paradas en más de 3 minutos.
  • Solo en depuración: EventLogger de ExoPlayer al registro, y en el núcleo
    el instante del primer fragmento de cada pista.

v0.9.23

Choose a tag to compare

@jopsis jopsis released this 11 Oct 07:06
  • El arreglo de la 0.9.22 (vo=libmpv) no bastaba: reproducido en el
    simulador con cuatro HLS locales y --ui-testing-multiview (solo Debug:
    entra en el multiview y añade un cuadro cada 8 s).
  • Causa 1: al entrar en el multiview, SwiftUI aún actualizaba la superficie
    de pantalla completa que se iba y su updateUIView le quitaba el
    reproductor a la del cuadro. Ahora la vista nueva se engancha al crearse,
    updateUIView solo engancha si no hay ninguna, y al quitarse una vista el
    vídeo vuelve a la anterior que siga viva (IOSMPVPlayerSurface y
    TVOSMPVPlayerSurface con coordinador).
  • Causa 2: al soltar la vista anterior se libera el contexto de render y con
    él la salida de vídeo de mpv, que no vuelve ni con vo ni quitando y
    poniendo la pista. Con el vídeo en marcha, cambiar de vista vuelve a abrir
    el canal (lo que no es directo, por donde iba).
  • Comprobado en el simulador: los cuatro cuadros con imagen y solo suena el
    elegido. ExoPlayer y multiview probados además en un OnePlus 7 Pro real
    (4 canales a 720p por hardware, unos 386 MB).

v0.9.22

Choose a tag to compare

@jopsis jopsis released this 11 Oct 05:08

ExoPlayer como segundo motor (Android)

  • Preferencias → Reproductor → Motor: MPV (por defecto) o ExoPlayer. No viaja
    con la sincronización: depende de lo que decodifique cada aparato.
  • PlaybackEngine (interfaz común) con MpvPlayer y ExoPlayerEngine
    (Media3 1.11.1). Los dos preparan con el núcleo, así que proxies, Smooth y
    claves son los mismos. La pantalla, el multiview y el traspaso entre ellos
    usan la interfaz.
  • El núcleo da ahora también manifest, headers y clearKeys (KID → clave)
    en playback.prepare. ExoPlayer descifra ClearKey con el de Android; se
    añade la clave para el KID cero, como hace FFmpeg con la clave por defecto.
  • Smooth servido por el núcleo: TimestampAdjuster compartido (los tiempos
    de la emisión empiezan en miles de millones) y SmoothDrmExtractor, que
    pone un pssh común en las pistas (el MP4 del núcleo no lo trae y sin él
    ExoPlayer no abre sesión DRM).
  • Subtítulos: SubtitleView encima del vídeo; los de addons van en el
    MediaItem y se fuerzan al elegirlos. Sin subtítulos al empezar, como mpv.
  • Si un vídeo no abre, el aviso dice con qué motor falló y ofrece «Probar con
    …» el otro solo para ese vídeo (como Stremio). En la tele, el botón toma el
    foco y los mandos no se dibujan encima.
  • En el reproductor, Pistas → «Reproductor»: cambiar de motor sin salir del
    vídeo (solo para ese vídeo). Lo que no es directo sigue por donde iba.
  • Probado en emulador (móvil y Android TV): HLS fMP4/TS/directo/AES-128, HLS
    SAMPLE-AES de Movistar+ por el proxy, DASH VOD/directo, DASH ClearKey
    (Axinom, Shaka, Orange), Smooth VOD corto y largo, Smooth en directo cifrado
    de Movistar, MP4, MKV, addon con MP4/HLS/MKV y subtítulos de OpenSubtitles,
    multiview de 4 canales (unos 171 MB PSS) y la reconexión cortando la red.
    Sin probar en aparato real.

Reconexión del directo (Android, iOS y tvOS)

  • Un directo que ya se veía y se corta (fin del flujo o error) se vuelve a
    preparar a los 1, 2, 4, 8 y 16 s; tras un minuto bien, se cuenta de cero.

Núcleo

  • SmoothLiveFeeder: el 412 es «fragmento aún no publicado» (Unified
    Streaming), como el 404, y no corta el canal. Test añadido.

Multiview (iOS y tvOS)

  • El primer cuadro se quedaba negro y se oía (lo reportó un usuario en
    iPhone): al pasar el reproductor a la vista del cuadro se libera el
    contexto de render de mpv y, con él, la salida de vídeo. Ahora se vuelve a
    poner vo=libmpv al enganchar una vista nueva. Lo mismo al volver a
    pantalla completa con otro cuadro. Compila; sin probar en aparato.

mpv (Android)

  • Con la libmpv de Stremio el fin de archivo solo llega por endFile: un
    canal que no abría se quedaba cargando para siempre. Ahora enseña el error.

v0.9.21

Choose a tag to compare

@jopsis jopsis released this 10 Oct 20:49
  • Una Bravia (Android 12, 32 bits) cerró la app tras unos 40 minutos de un
    contenido HLS SAMPLE-AES bajo demanda, con tirones antes. El registro,
    mandado desde el arranque siguiente, no traía nada del proceso que falló:
    el logcat se filtraba por el pid actual.
  • DiagnosticsLog.kt: el logcat ya no se filtra por pid. Android solo deja
    leer las líneas de la propia app, así que ahora entran también las del
    proceso anterior.
  • Nueva sección «Cierres anteriores» con getHistoricalProcessExitReasons
    (Android 11 o posterior): motivo (sin memoria, fallo de Java o nativo, ANR…),
    hora, importancia, PSS/RSS y la descripción del sistema de los últimos cinco.
  • Compila; no se ha probado en aparato.

v0.9.20

Choose a tag to compare

@jopsis jopsis released this 10 Oct 18:32

Multiview (Android, iOS y tvOS)

  • Botón «Multiview» en el reproductor, solo en directo. El canal que se ve
    pasa al primer cuadro de una cuadrícula de 2×2 con el mismo reproductor, sin
    volver a abrirse (MultiviewScreen.kt; IOSMultiviewView.swift, compartido
    por iOS y tvOS, con IOSPlaybackHandoff para volver a pantalla completa con
    otro cuadro).
  • «+» añade un canal de la lista de zapping, empezando por el siguiente. Suena
    solo el cuadro elegido: los demás van con mute y no con aid=no, porque en
    directo volver a poner la pista deja el canal parado hasta que el audio
    alcanza al vídeo.
  • Menú de cada cuadro: pantalla completa, cambiar canal, quitar. «Atrás» sale a
    pantalla completa con el cuadro elegido.
  • Tope de calidad: maxVideoHeight en PlaybackPreparation.prepare (DASH, HLS
    con ClearKey y Smooth) y hlsBitrateCap para hls-bitrate de mpv cuando
    mpv ve el master entero. Los cuadros nuevos abren a ≤720p; con el cuarto,
    todos. Tests: QualityCapTests.
  • Varios controladores a la vez en iOS/tvOS: la sesión de audio y el «no
    apagar la pantalla» se sueltan cuando ya no queda ninguno.
  • Probado en el Chromecast con Google TV (4 canales a 720p por hardware, unos
    670 MB). iOS y tvOS compilan pero no se han probado en aparato.

Favoritos y recientes (Android, iOS y tvOS)

  • Petición de un usuario. Dos grupos fijos, «★ Favoritos» y «Recientes»,
    delante de «Todos» (solo en el directo). Un canal se marca manteniéndolo
    pulsado en la rejilla (combinedClickable en Android, contextMenu en
    iOS/tvOS) o con la estrella del reproductor; las tarjetas favoritas llevan
    una estrella. Recientes: los últimos 20 canales en directo abiertos, también
    al zapear, del último hacia atrás.
  • Se identifican por grupo + nombre, que sobrevive a recargar la lista (el id
    es la posición). Se guardan en cada aparato; no se sincronizan por Drive.
  • Con «Favoritos» elegido, el zapping y el selector del multiview se mueven
    entre favoritos. Sin probar en aparato.

Android: el APK de la actualización ya no se queda en el aparato

  • cache/update/update.apk (unos 60 MB) seguía ahí tras instalarse hasta que
    Android vaciaba la caché. AppUpdater lo borra al arrancar.

Proxies que no se quedan sin hilos

  • Los accept() de los proxies DASH/HLS, el servidor de Smooth y el DNS
    bloqueaban hilos de DispatchQueue.global y del pool de Swift, que en
    Android tienen un hilo por núcleo. Con cuatro canales en el Chromecast (4
    núcleos) todo se quedaba en «Conectando…», y cambiar de canal muy seguido
    podía atascarse igual. BlockingIO (en LiveHTTPServer.swift) los saca a
    hilos propios.

Android: el renderizado por sistema ya no se cae al reabrir

  • checkSystemRenderer miraba hwdec-current en cuanto había tamaño de
    vídeo, también entre un archivo y otro (cambiar de calidad), cuando mpv
    responde «no», y pasaba a vo=gpu sin motivo. Ahora mira al arrancar la
    reproducción y solo con un vídeo abierto.

«Enviar registro» llega por Telegram (Android)

  • El registro se manda al desarrollador con el bot @isplayer_registry_bot
    (DiagnosticsLog.sendToDeveloper), con lo que el usuario cuente y un código
    para identificarlo. Uno por minuto como mucho. «Compartir» sigue como
    alternativa. Token y chat en Config/GoogleOAuth.local.xcconfig (fuera del
    repo); sin ellos, la app solo ofrece compartir. Sin probar el envío desde un
    aparato.

v0.9.19

Choose a tag to compare

@jopsis jopsis released this 10 Oct 14:10

Catálogos JSON con el formato de OTT Navigator

  • El catálogo JSON ya era el «Media library file» de OTT Navigator
    (https://ottnav.github.io/faq.html#media-library-file-json); ahora se lee
    entero. OTVNormalizer (en JSONPlaylistParser.swift) deja el JSON como
    si no trajera lo siguiente antes de decodificarlo:
    • textos en BASE64 sin relleno, según el elemento técnico
      { "base64": "name,video" } (*: todos los textos);
    • textos por idioma ("name:es"): manda el del idioma del aparato.
  • headers como objeto JSON ({"User-Agent": "…"}). Antes un objeto hacía
    fallar la decodificación y el título desaparecía de la lista.
  • Temporadas y episodios sin número se numeran por su posición.
  • backdrop como fondo y trailer dentro de info, también como id de
    YouTube suelto.
  • Los tráileres de YouTube (VODMetadata.trailerYouTubeID) ya no intentan
    abrirse en mpv, que no puede: se abren en YouTube (Safari o la app en iOS,
    la app en tvOS, vnd.youtube: o el navegador en Android).
  • Tests: OTTNavigatorCatalogTests, con el ejemplo oficial tal cual. Sin
    probar en aparato con una lista real.

Addons detrás de un proxy (Pictorium)

  • Un addon cuya dirección lleva parámetros
    (…/api/proxy/manifest.json?url=…&u=…, el proxy de pósters de Pictorium)
    perdía la query al pedir catálogos, fichas, enlaces y subtítulos. Ahora
    StremioAddonURL.query se añade a cada recurso, como hace Stremio.
  • Cinemeta y OpenSubtitles se reconocen por su dirección, no por su id: un
    proxy repite el id del addon que envuelve y se confundía con el de serie.
  • El addon propio de Pictorium (/u/…/manifest.json) ya funcionaba. Su
    proxy responde hoy 403 a cualquier petición (lado servidor), así que esa
    forma no se ha podido probar contra el servicio real.