Univerzitet u Novom Sadu
Fakultet tehničkih nauka
Odsek za računarsku tehniku i računarske komunikacije
Projektovanje NamenskihRačunarskih Struktura
Sistemsko programiranje u Androidu
AndroidTV
(evolucija, koncept, softverska arhitekura)
Zimski semestar školske godine 2018/2019
Agenda
Motivacija
Istorijat
GoogleTV
AndroidTVMotivacija
Arhitektura
Životni vek
Zaštita
PNRS 22018
Agenda
Motivacija
Istorijat
GoogleTV
AndroidTVMotivacija
Arhitektura
Životni vek
Zaštita
PNRS 32018
Motivacija
Zašto Android u TV uređajima?
PNRS 42018
Agenda
Motivacija
Istorijat
GoogleTV
AndroidTVMotivacija
Arhitektura
Životni vek
Zaštita
PNRS 52018
IstorijatGoogleTV vs Android TV
Istorijat:
Prvi uređaji su pušteni na tržište 2010 (Sony i Logitech)
Bazirani na x86 arhitekturi (kasnije ARM)
Chrome podrška prisutna, ali limitirana podrška Google play store aplikacijama
Specijalizovana pretraga (optimizovana za TV, sa podrškom za glasovnupretragu)
Juna 2014, GoogleTV je zvanično nasleđen sa Android TV platformom
Sličnosti:
Zvanična Google implementacija TV servisa u Android okruženje
Softverska arhitektura
Razlike:
GoogleTV je platforma koja nije otvorenog koda
U početku (v2-v3) nije imala podršku za NDK (glibc integrisan, zbog
Chrome)
PNRS 62018
Agenda
Motivacija
Istorijat
GoogleTV
AndroidTVMotivacija
Arhitektura
Životni vek
Zaštita
PNRS 72018
Agenda - detaljnije
GoogleTVArhitektura
Protok podataka
Podrška za pretragu
GoogleTV Media Player
PNRS 82018
GoogleTVSoftverska arhitektura
Pokušaj da se objedine multimedijalne potrebe
Bazirana na MDS(MediaDeviceService)
Višestruki CMD(Custom Media Devices)
Dostupni kroz MDV(MediaDeviceView)
PNRS 92018
GoogleTVJednosmerna vs Dvosmerna
komunikacija
PNRS 102018
GoogleTVTV aplikacija
PNRS 112018
GoogleTVCustom Media Device (CMD)
Discovery (raspoloživost za uparivanje, obznanjivanje mogućnosti
Setup (uparivanje, specijalizovan setup, ako ima)
Controlling (channel up, down, itd)
Digital TV stek (EPG, Teletext) i PVR
PNRS 122018
GoogleTVCMD primer
MAL (Middleware Abstraction Layer) API
Platform Drivers
DTV Middleware System Service
Middleware
CHAL
Middleware top level API
DTV Service
iWedia Media Device
Setup
DeviceTunner
Controller
Media Device View
TV Player App
(LiveTV)
Media Devices Service
Media Devices Session
iWedia DVB Player
iWedia Framework
Components
Vendor Components
iWedia DVB Middleware
Components
Google TV Components
PNRS 132018
Agenda - detaljnije
GoogleTVArhitektura
Protok podataka
Podrška za pretragu
GoogleTV Media Player
PNRS 142018
GoogleTVStruktura/protok podataka
Protok podataka i komandi:
TV aplikacija (LiveTV ili neka druga) instancira MDV
Korisničke akcije se prosleđuju direktno do MDV, koji korišćenjem MDS dobavlja referencu uparenog MD kontrolera (pomoću sesije)
Ovo omogućuje direktnu Binder komunikaciju između TV aplikacije i MD kontrolera (komunikacija može biti jednosmerna ili dvosmerna u zavisnosti od samog kontrolera i prati MDS spregu)
MD kontroler ima otvorenu Binder (najčešće, može i direktna JNI) vezu ka TV middleware softveru
PNRS 152018
GoogleTVStruktura/protok podataka
Akcije raspoložive TV aplikaciji (samim tim i korisniku):
Prebacivanje na željeni TV servis
Prebacivanje na sledeći TV servis
Prebacivanje na naredni TV servis
Akcije raspoložive ka QSB aplikaciji:
Dobavljanje EPG i TTX sadržaja putem MDS od CMD
Pristup informacijama o TV servisima
Pristup listi kanala (engl. tv service lineup)
PNRS 162018
Agenda - detaljnije
GoogleTVArhitektura
Protok podataka
Podrška za pretragu
GoogleTV Media Player
PNRS 172018
GoogleTVPodrška za pretragu
Putem specijalizovane QSB aplikacije (GoogleTV QSB)
Bez upotrebe Google backend (Google serveri) Lokalno iz DVB toka, putem TV middleware
Kombinovani rezultati sa drugim servisima: Youtube, Web
Proširenja dvosmerne komunikacije: Predložena od strane RT-RK
PNRS 182018
GoogleTVPodrška za pretragu (primer)
PNRS 19
Platform Drivers
DTV Middleware System Service
Middleware
CHAL
Middleware top level API
DTV Service
iWedia Media Device
Setup
DeviceTunner
Controller
iWedia Framework
Components
Vendor Components
iWedia DVB Middleware
Components
Google TV Components
Media Devices Service
Media Devices Session
iWedia DVB Player
EPG
Database
TTX
Database
QSB
2018
GoogleTVPretraga – Korisnički scenariji
EPG
Pretraživo: Ime TV servisa, ime emisije koja se prikazuje (trenutno i u bližoj budućnosti), kratak/dugačak opis emisije
Propratna akcija: prebacivanje na pronađeni TV servis
PNRS 202018
GoogleTVPretraga – Korisnički scenariji
TTX
Pretraživo: Naslov TTX strane, sadržaj svih TTX stranica na TV servisu koji se trenutno gleda
Propratna akcija:
Pronađeni tekst je dodatno naznačen (engl. highlighted)
Prikaz pronađene TTX stranice
PNRS 212018
Agenda - detaljnije
GoogleTVArhitektura
Protok podataka
Podrška za pretragu
GoogleTV Media Player
PNRS 222018
GoogleTVMedia Player
GoogleTV Media Player se zove MooPlayer
Mora biti prisutan i portovan na ciljnu platformu
Ima podršku za rukovanje resursima
GoogleTV ekstenzije standardnom MM okruženju:
OMX IL potpun graf (tunelovan)
Više “izvora” i lako proširivih “ekstraktora”
Bolja podrška za DRM (Widevine, Playready) + TrustedVideo Path
Višestruke audio/(video)/prevod trake
QoS (Quality of Service) pomoćna sprega
PNRS 232018
GoogleTVMedia Player
Prenosivi uređaji (telefon, tablet) imaju potpuno drugačija očekivanja od strane korisnika, vezano za video reprodukciju
Kod TV uređaja, prikaz TV (video) sadržaja je primarna aktivnost, koja ne sme biti ometena i prekinuta (usled neregularnog zaustavljanja neke aplikacije)
Istovremeni prikaz dva video sadržaja je očekivan (PiP, PaP), gde svi izvori video sadržaja ne moraju da budu vezani za TV servise (npr. Youtube, GooglePlay movies)
Stoga je bilo neophodno uvesti mehanizam za sinhronizaciju hardverskih resursa (A/V dekoderi, DMX, renderer) između više aplikacija
Uveden je Menadžer resursima (engl. ResourceManager) kao standardna komponenta GoogleTV sistema
PNRS 242018
GoogleTVMenadžer resursima
Uloga menadžera resursima je:
Sinhronizuje hardverske resurse ciljne platforme
Omogući da aplikacije zatraže neophodne resurse
Omogući da aplikacije oslobode neophodne resurse kada im više nisu potrebni
Spreči neograničeno (vremenski nepredvidivo) zaključavanje resursa
Ukoliko neka aplikacija uđe u ANR stanje
Ukoliko se aplikacija nasilno zaustavi i ne oslobodi svoje resurse
Obezbedi arbitražu prioriteta
Koja aplikacija ima veći prioritet prilikom dodele/oduzimanja resursa (LiveTV)
Spreči oduzimanje resursa TV aplikaciji (i time obezbedi neometanu reprodukciju TV sadržaja)
U pitanju je nezavisni izvršni servis (pozadinski proces), kojeg svaki izvršni MediaPlayer mora da koristi, po jasno definisanoj sprezi.
PNRS 252018
GoogleTVMenadžer resursima
PNRS 262018
GoogleTVMenadžer resursima
PNRS 272018
GoogleTVNDK
NDK podrška za GoogleTV platformu je uvedena tek sa verzijom 4
Bazirana na JB 4.2.2
U prethodnim verzijama je nedostajala zbog libc
biblioteke:
v4 ponovo koristi Bionic
Prethodne verzije su koristile glibc
Dozvoljava (skoro) sve regularne Android aplikacije sa GooglePlay Store servisa da se izvršavaju na GoogleTVuređaju:
Touch? GPS? Gyro?
PNRS 282018
GoogleTVMane
GooglePlay Store servis
Zahteva sertifikaciju i prolazak CTS testova
Sertifikacija ima više koraka:
CTS + TV-CTS
DRM
MDS sprega je dosta limitirana (nedostaje joj veći deo funkcija neophodnih za razvoj moderne TV platforme)
Upotreba CMD je obavezna!
Mnogo oštriji zahtevi sa stanovišta mogućnosti softvera i hardvera
PNRS 292018
Agenda
Motivacija
Istorijat
GoogleTV
AndroidTVMotivacija
Arhitektura
Životni vek
Primeri
PNRS 302018
Agenda
Motivacija
Istorijat
GoogleTV
AndroidTVMotivacija
Arhitektura
Životni vek
Primeri
PNRS 312018
Android TVMotivacija
Obezbediti korisniku najbolji mogući korisnički ugođaj
Standardizovati API Jedan TV Input A na uređaju X, takođe radi i na uređaju Y
Jedna TV aplikacija, koja radi na svim uređajima
Unificirani TV ugođaj Korišćenje jedne TV aplikacije za sve izvore TV sadržaja (kako
preinstalirane tako i naknadno instalirane preko Google Play store)
Integracija TV u Android na standardan način
Bez održavanja posebne grane (GoogleTV pristup)
Integracija sa pretragom (+glasovna pretraga)
PNRS 322018
Android TVMotivacija
PNRS 332018
Android TVMotivacija
PNRS 342018
Android TVMotivacija
PNRS 352018
Android TVMotivacija
PNRS 362018
Agenda
Motivacija
Istorijat
GoogleTV
AndroidTVMotivacija
Arhitektura
Životni vek
Primeri
PNRS 372018
Android TVSoftverska arhitektura
PNRS 382018
Android TVPregled glavnih komponenti
TV App: com.google.android.tv
Glavna (i jedina) aplikacija koja služi za gledanje TV sadržaja.
Proizvođači uređaja mogu da prilagode GUI ove aplikacije (umesto da pišu svoju od početka).
TV Input Manager Service: com.android.server.tv
Sistemski servis koji upravlja TV ulazima.
TV Input: android.media.tv
Individualna implementacija jednog TV ulaza (Tuner, HDMI, etc.).
TV Provider: com.android.providers.tv ContentProvider za upravljanje listom TV kanala/emisija.
PNRS 392018
Android TVTV Input Manager Service
Sistemski servis koji arbitrira interakciju TV aplikacije i TV ulaza (putem sesije)
Pravi sesiju koja obezbeđuje pristup individualnim TV ulazima i održava stanje sesije
Pokreće čišćenje TV Provider baze podataka, kada se aplikacija sa TV ulazom obriše iz sistema
PNRS 402018
Android TVTV Input Manager Service
PNRS 412018
Android TVTV Provider
ContentProvider za TV koji čuva listu kanala i emisija.
Obezbeđuje prethodno skladištene podatke aplikacijama kroz ContentResolver spregu
Ima podršku za proveru prava pristupa (TV ulaz vidi samo svoje kanale)
Format kanala (TV servisa) i programa (EPG) su definisani u: android.media.tv.TvContract.Channels.COLUMN_*
android.media.tv.TvContract.Programs.COLUMN_*
PNRS 422018
Android TVTV Provider
PNRS 432018
Android TVTV Input
Android servis (Java) koji obezbeđuje TV sadržaj
Postoje dva tipa podržana: Tuner: ugrađeni tuner, IPTV tuner, TV ulaz baziran na protokolu
(streaming)
Passthrough: HDMI, Component
Glavno zaduženje: Reakcija na onTune(...)i prikaz TV sadržaja u obezbeđenu video
površinu (Surface)
PNRS 442018
Android TVTV Input
PNRS 452018
Android TVTV Input - Klase
TvInputService
TvInputService.Session
TvContract
TvContract.Program
TvContract.Channels
TvContentRating
TvInputInfo
TvTrackInfo
TvInputManager
PNRS 462018
Agenda
Motivacija
Istorijat
GoogleTV
AndroidTVMotivacija
Arhitektura
Životni vek
Primeri
PNRS 472018
Android TVTV Input – Životni vek
PNRS 482018
Agenda
Motivacija
Istorijat
GoogleTV
AndroidTVMotivacija
Arhitektura
Životni vek
Primeri
PNRS 492018
AndroidTVPrimeri
Definisanje TvInputService u AndroidManifest.xml:
Definisanje XML za metadata podatke TV ulaza:
PNRS 50
<service android:name="com.vendor.tvinput.VendorTvInput"
android:label="@string/vendor_tv_input_label"
android:permission="android.permission.BIND_TV_INPUT">
<intent-filter>
<action android:name="android.media.tv.TvInputService" />
</intent-filter>
<meta-data android:name="android.media.tv.input"
android:resource="@xml/vendor_tv_input" />
</service>
<!-- xml/vendor_tv_input.xml -->
<tv-input xmlns:android="http://schemas.android.com/apk/res/android"
android:setupActivity="com.vendor.tvinput.VendorSetupActivity"
android:settingsActivity="com.vendor.tvinput.VendorSettingsActivity" />
2018
AndroidTVPrimeri - Setup
TV aplikacija je zadužena za pokretanje aktivnosti za podešavanje (engl. SetupActivity) kada TV ulaz nije podešen
Obično ovaj korak uključuje skeniranje kanala (TV servisa)
Tokom ove aktivnosti, podatke o pronađenim TV servisima je potrebno uneti u TV Provider bazu podataka.
Definisanje aktivnosti podešavanja:
PNRS 51
<activity android:name=".VendorSetupActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
2018
AndroidTVPrimeri - Setup
Unos jednog TV servisa u bazu podataka:
PNRS 52
ContentValues values = new ContentValues();
values.put(Channels.COLUMN_DISPLAY_NUMBER, channel.mNumber);
values.put(Channels.COLUMN_DISPLAY_NAME, channel.mName);
values.put(Channels.COLUMN_ORIGINAL_NETWORK_ID, channel.mOriginalNetworkId);
values.put(Channels.COLUMN_TRANSPORT_STREAM_ID, channel.mTransportStreamId);
values.put(Channels.COLUMN_SERVICE_ID, channel.mServiceId);
values.put(Channels.COLUMN_VIDEO_FORMAT, channel.mVideoFormat);
values.put(Channels.COLUMN_INTERNAL_PROVIDER_DATA, channel.mPrivateData);
Uri uri = getContentResolver().insert(Channels.CONTENT_URI, values);
2018
AndroidTVPrimeri – Podaci o TV servisima
Unos jednog TV servisa u bazu podataka:
Kada se unosi veća količina podataka, bolje je koristiti bulkInsert() ili applyBatch() funkcije:
PNRS 53
ContentValues values = new ContentValues();
values.put(Channels.COLUMN_DISPLAY_NUMBER, channel.mNumber);
values.put(Channels.COLUMN_DISPLAY_NAME, channel.mName);
values.put(Channels.COLUMN_ORIGINAL_NETWORK_ID, channel.mOriginalNetworkId);
values.put(Channels.COLUMN_TRANSPORT_STREAM_ID, channel.mTransportStreamId);
values.put(Channels.COLUMN_SERVICE_ID, channel.mServiceId);
values.put(Channels.COLUMN_VIDEO_FORMAT, channel.mVideoFormat);
values.put(Channels.COLUMN_INTERNAL_PROVIDER_DATA, channel.mPrivateData);
Uri uri = getContentResolver().insert(Channels.CONTENT_URI, values);
ArrayList<ContentProviderOperation> ops = new ArrayList<>();
int size = mPrograms.size();
for (int i = 0; i < size; ++i) {
ProgramInfo program = mPrograms.get(i);
ops.add(ContentProviderOperation
.newInsert(TvContract.Programs.CONTENT_URI)
.withValues(...)
.build());
if (i % 100 == 99 || i == size - 1) {
getContentResolver().applyBatch(TvContract.AUTHORITY, ops);
ops.clear();
}
}
2018
AndroidTVPrimeri – Podaci o TV servisima
Kada se osvežava baza TV servisa, potrebno je koristiti update() funkciju, umesto delete(), praćenu sa insert()
Obrada podataka ne treba da blokira “glavnu” nit. Preporuka je koristiti AsyncTask, kao jedan način na koji
se ovaj zadatak može izvesti asinhrono:
Ukoliko se podaci dovlače sa servera (IPTV), razmisliti o SyncAdapter-u.
PNRS 542018
AndroidTVPrimeri – TV Input
Glavna uloga TvInputService je da kreira i obezbedi instancu TvInputService.Session na zahtev
Uglavnom, ovaj zahtev dolazi od TV aplikacije, kada pokuša da promeni TV servis, na odgovarajućem TvView
PNRS 55
public class VendorTvInputService extends TvInputService {
@Override
public final Session onCreateSession(String inputId) {
// May return null if the device is not available at the moment.
return new VendorSession(VendorTvInputService.this);
}
...
}
2018
AndroidTVPrimeri – TV Input sesija
Kada se napravi sesija za odgovarajući ulaz, TV aplikacija prosleđuje Surface objekat i URI TV servisa.
PNRS 56
public class VendorSession extends Session {
@Override
public boolean onSetSurface(Surface surface) {
// Connect the surface with the tv_input HAL.
TvInputManager.Hardware hardware = mManager.acquireTvInputHardware(...);
TvStreamConfig config;
// Get the config via TvInputManager.HardwareCallback before calling
// setSurface()
hardware.setSurface(surface, config);
return true;
}
@Override
public boolean onTune(Uri channelUri) {
notifyVideoUnavailable(VIDEO_UNAVAILABLE_REASON_TUNING);
// Do own operation for tuning to a new channel.
// Either register a callback that invokes notifyVideoAvailable() when
// tuning is done (preferred) or call it here.
notifyVideoAvailable();
}
2018
AndroidTVPrimeri – Video status
TV aplikacija se oslanja na status video reprodukcije od TV ulaza:
notifyVideoAvailable()
Obaveštava TV aplikaciju da je video spreman za gledanje
Koristi se da se TV aplikaciji da do znanja da omogući video prikaz
notifyVideoUnavailable()
Obaveštava TV aplikaciju da video sadržaj više nije spreman za gledanje.
Mogući razlozi su:VIDEO_UNAVAILABLE_REASON_UNKNOWN
VIDEO_UNAVAILABLE_REASON_TUNING
VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL
VIDEO_UNAVAILABLE_REASON_BUFFERING
PNRS 572018
AndroidTVPrimeri – Prevodi i multiaudio
Za svaki TV servis, TV ulaz treba da obezbedi informacije o broju i tipu traka za prevode i audio (ukoliko postoje)
Koristite TvTrackInfo.Builder za konstrukciju
specifičnih video/audio/prevod informacija:
PNRS 58
TvTrackInfo track = new TvTrackInfo.Builder(TvTrackInfo.TYPE_AUDIO, “ID-X”)
.setAudioChannelCount(format.numChannels)
.setAudioSampleRate(format.audioSamplingRate)
.setLanguage(format.language)
.build();
2018
AndroidTVPrimeri – Prevodi i multiaudio
Potrebno je pozvati notifyTracksChanged(...) čim
se informacije o novoj traci obezbede, i obezbediti odgovor na onSelectTrack(...) funkciju.
PNRS 59
public class VendorSession implements Session {
@Override
public boolean onTune(Uri channelUri) {
mVendorTuner.tune(channelUri, new VendorTunerCallback() {
void onTuneDone() {
notifyTracksChanged(mVendorTuner.getTracks());
// Report the tracks selected by default.
notifyTrackSelected(TvTrackInfo.TYPE_AUDIO,
mSelectedAudioTrack);
// Do the same for TYPE_SUBTITLE, if available.
}
});
}
@Override
public boolean onSelectTrack(int type, String trackId) {
if (mVendorTuner.selectTrack(type, trackId)) {
notifyTrackSelected(type, trackId);
}
}
2018
AndroidTVPrimeri – Overlay
TV ulazi mogu da koriste overlay mehanizam (prikaz
grafičkog sadržaja “preko” video sadržaja) za prikaz prevoda, banera (za reklame) i sl.
PNRS 60
public class VendorTvInputService extends TvInputService {
@Override
public final Session onCreateSession(String inputId) {
VendorSession session = new VendorSession(
VendorTvInputService.this);
session.setOverlayViewEnabled(true);
return session;
}
public class VendorSession extends Session {
@Override
public View onCreateOverlayView() {
LayoutInflater inflater = (LayoutInflater)getSystemService(
LAYOUT_INFLATER_SERVICE);
mView = inflater.inflate(R.layout.overlayview, null);
return mView;
}
...
2018
Kraj
Pitanja?
PNRS 612018
Literatura
https://www.android.com/tv/
https://source.android.com/devices/tv/
2018 PNRS 62