Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van...

75
Faculteit Ingenieurswetenschappen en Architectuur Vakgroep Electronica en Informatiesystemen Voorzitter: prof. dr. ir. Jan Van Campenhout Implementatie en uitbreiding van de Media Fragments-specificatie op Android door Tim DE MEY Promotoren: prof. dr. ir. Rik Van de Walle, Brecht Stubbe Begeleiders: Wim Van Lancker, dr. Davy Van Deursen Masterproef ingediend tot het behalen van de academische graad van Master in de ingenieurswetenschappen: computerwetenschappen Academiejaar 2011–2012

Transcript of Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van...

Page 1: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

Faculteit Ingenieurswetenschappen en Architectuur

Vakgroep Electronica en Informatiesystemen

Voorzitter: prof. dr. ir. Jan Van Campenhout

Implementatie en uitbreiding van de

Media Fragments-specificatie op Android

door

Tim DE MEY

Promotoren: prof. dr. ir. Rik Van de Walle, Brecht Stubbe

Begeleiders: Wim Van Lancker, dr. Davy Van Deursen

Masterproef ingediend tot het behalen van de academische graad van

Master in de ingenieurswetenschappen: computerwetenschappen

Academiejaar 2011–2012

Page 2: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot
Page 3: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

Faculteit Ingenieurswetenschappen en Architectuur

Vakgroep Electronica en Informatiesystemen

Voorzitter: prof. dr. ir. Jan Van Campenhout

Implementatie en uitbreiding van de

Media Fragments-specificatie op Android

door

Tim DE MEY

Promotoren: prof. dr. ir. Rik Van de Walle, Brecht Stubbe

Begeleiders: Wim Van Lancker, dr. Davy Van Deursen

Masterproef ingediend tot het behalen van de academische graad van

Master in de ingenieurswetenschappen: computerwetenschappen

Academiejaar 2011–2012

Page 4: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

Voorwoord

Graag wil ik even de tijd nemen om iedereen te bedanken die er direct of onrechtstreeks voor

gezorgd heeft dat ik deze masterproef kon aanvatten.

Eerst en vooral gaat mijn dank uit naar Davy voor zijn geduld als ik even niet mee was, voor

het nalezen van de teksten en om mij er steeds vriendelijk op te wijzen als er te weinig structuur

zat in de tekst. Ik wil zeker ook Wim niet vergeten, die jammer genoeg sinds januari er niet

meer bij kon zijn.

Verder wil ik ook de promotoren prof. Rik Van de Walle en Brecht Stubbe bedanken voor het

onderwerp. Ik programmeer zeer graag en ben dan ook met plezier de uitdaging aangegaan om

op een onbekend platform een applicatie te maken.

Ik bedank ook de persoon achter de schuilnaam ’WTFMAN’ (wiens echte naam ik niet ken)

vanop het 9lives-forum om zijn GSM aan mij te verkopen, zodat ik thuis over een echt Android-

apparaat beschikte om op te werken.

Tim De Mey, mei 2012

Page 5: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

Toelating tot bruikleen

”De auteur geeft de toelating deze masterproef voor consultatie beschikbaar te stellen en delen

van de masterproef te kopieren voor persoonlijk gebruik.

Elk ander gebruik valt onder de beperkingen van het auteursrecht, in het bijzonder met be-

trekking tot de verplichting de bron uitdrukkelijk te vermelden bij het aanhalen van resultaten

uit deze masterproef.”

“The author gives permission to make this master dissertation available for consultation and to

copy parts of this master dissertation for personal use.

In the case of any other use, the limitations of the copyright have to be respected, in particular

with regard to the obligation to state expressly the source when quoting results from this master

dissertation.”

Tim De Mey, mei 2012

Page 6: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

Implementatie en uitbreiding van deMedia Fragments-specificatie op Android

door

Tim DE MEY

Masterproef ingediend tot het behalen van de academische graad van

Master in de ingenieurswetenschappen: computerwetenschappen

Academiejaar 2011–2012

Promotoren: prof. dr. ir. Rik Van de Walle, Brecht Stubbe

Begeleiders: Wim Van Lancker, dr. Davy Van Deursen

Vakgroep Electronica en Informatiesystemen

Voorzitter: prof. dr. ir. Jan Van Campenhout

Faculteit Ingenieurswetenschappen

Universiteit Gent

Samenvatting – In het weblandschap worden media-objecten nog steeds als ’foreign objects’

beschouwd: zij worden niet door de browser zelf maar door een plugin gerenderd. Bovendien

kunnen deze objecten niet op een URI-gebaseerde manier gefragmenteerd worden. De Media

Fragments-specificatie tracht dit laatste probleem op te lossen. In deze masterproef wordt Media

Fragments uitgelegd, alsook waarom er nood is aan implementaties van deze specificatie. Er werd

ook een Media Fragments parser geschreven en een implementatie op het Android-platform.

Trefwoorden – Media Fragments, Android, Mobiel, HTML5, standaardisatie

Page 7: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

Extending and implementing the Media Fragmentsspecification on the Android platform

Tim De Mey

Supervisor(s): Davy Van Deurzen, Rik Van de Walle

Abstract—In the web universe, media objects are still con-sidered ’foreign objects’, as they are being rendered by aplugin rather than the browser itself. Moreover, these typesof objects cannot be fragmented in a URI-based manner.This article briefly describes the Media Fragments specifica-tion, a URI-based approach for fragmenting media objects,and explains the need for implementations of this specifica-tion. In addition, we investigate how Media Fragments canbe extended in a useful manner. In the rest of the article, wedescribe the steps taken to create a Media Fragments com-patible video player on the Android platform, and explainthe investigations we made to diminish an Android powereddevice’s data traffic consumption when using Media Frag-ment URI’s.

Keywords— Media Fragments, Android, Mobile, HTML5,Standardisation

I. Introduction

MEDIA objects are still considered ’foreign objects’due to two reasons. First, they are treated by

browsers as a black box. More specifically, browsers relyon plugins, such as Flash, to have audio and video get ren-dered. Secondly, media objects cannot be fragmented ina standardized, URI-based manner. In contrast with this,objects of certain MIME-types can be fragmented as listedin Table I [2], [3].

TABLE I

MIME-types and their URI-based fragmentation

application/pdf ...book.pdf#page=34text/html ...index.html#somethingtext/plain ...text.txt#line=32,40

HTML5 solves the black box problem by introducing the<video> and <audio> tags [4]. Media objects referenced ina web page are thus no longer hidden from the browser asthey were by usage of the generic <object> and <embed>

HTML tags. On the other hand, there is still no stan-dardized way to fragment media objects via the URI. TheMedia Fragments specification tries to address this issue.

II. The Media Fragments specification

Media Fragments specifies how media objects can befragmented via the fragment identifier within a URI [1].Given a URI, the ’primary resource’ - e.g. the referenceto a media file - can be distinguished from the fragmentidentifier by the ’#’ character (see also Table I). The spe-cification defines fragmentation along four dimensions:• Temporal dimension - example: ...#t=10,20. The videowill play from the 10th to 20th second.

• Spatial dimension - example: ...#xywh=10,20,40,60.A rectangle starting at 10 pixels from the left, 20 pixelsfrom the top, 40 pixels wide and 60 pixels high, will bedrawn on top of the video, with the outside area darkenedor some similar effect, to draw attention to the rectangle’sinside content.• Track dimension - example: ...#track=video. Thetrack named ’video’ will be extracted from the media con-tainer.• ID dimension - example: ...#id=chapter-1. Thenamed temporal segment ’chapter-1’ will be played.

Multiple key-value pairs can be entered by glueing themwith a ’&’, e.g. ...#t=10,20&xywh=10,20,40,60.

III. Problem Definition

The Media Fragments specification aims to be stan-dardized. To achieve this, implementations for the spe-cification have to be created in order to get feedback of im-plementors and to prove that the specification is useful andimplementable. This way the specification can be adaptedand improved. There are already such implementations,but not on mobile devices. Such implementations wouldcontribute greatly to the specification, as these devices aregenerally limited in bandwidth; Using Media Fragments’temporal dimension, mobile video players wouldn’t needto buffer data beyond the point where the temporal frag-ment ends. In addition, a mobile implementation of thespecification would prove that Media Fragments is also im-plementable on devices other than computers, as all imple-mentations have been made on such devices.

Spatial fragmentation defines a static rectangle. Thismay cause some difficulties when trying to focus spatiallyon a moving or an enlarging object within a video. Thisexample indicates that Media Fragments should be investi-gated to determine whether there is room for improvementor extensions.

IV. Media Fragments on Android

A mobile ’app’ has been built on the Android platform.This app uses a Media Fragments parser library, which wasdeveloped first.

A. Media Fragments URI parser library

The Media Fragments parser takes a single URI as itsinput and parses the fragment identifier as a Media Frag-ments URI. First, the fragment identifier is split into key-value pairs. Secondly, percent-decoding is applied (e.g.’%74’ becomes ’t’). Then, for each pair, a specific value

Page 8: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

parser will be selected based on the valid key (e.g. ’t’, de-noting the temporal dimension, will induce the use of aTemporalValueParser).

When parsing stops, all valid pairs can be requested inan object-oriented manner. The parser is available as alibrary (.jar file) for usage in any application.

B. Android Media Fragments player

Not all of the Media Fragments dimensions are supportedin the app as it was technically impossible to implementthem (e.g. extracting a track from a media container).The spatial dimension is fully implemented and the tempo-ral dimension can be supplied by using Normal Play Time(NPT) notation.

A URI can be entered at the start screen. A secondscreen will be displayed which shows the parsing results.The third component is the actual Media Fragments en-abled video player. This component can be selected ashandling component by a user, for example, when clickingon a link in a browser that is referring to a video resource.

Figure 1 shows two screenshots of the app. It is possibleto zoom in on a spatial fragment. When the device rotates,the video will rotate accordingly to match the device’s neworientation. The temporal fragment is indicated by theyellow color on the progress bar.

Fig. 1. 2 screenshots

C. Bandwidth consumption

Various efforts have been made to make our video playerjust download the video data needed to display a particulartemporal fragment, specified by a Media Fragments URI,as the standard Android SDK doesn’t provide any way ofcontrolling bandwidth usage.

• Compiling and using the FFmpeg library on Android tocalculate the needed byte ranges.• Using a proxy server which will only download the neededdata, and blocks requests to the real outside server for datanot within the allowed range.• Write the needed data to a file first, while replacing all’missing data’ with stuff bytes.

x,y,w,h x,y,w,hkeep

x,y,w,hinterpolate

temporal fragment

t0s 20s 40s 60s 80s

Fig. 2. A schematic visualisation of a trajectory

• Using the Vitamio media library, where normally thestandard Android SDK media library would be used. Vita-mio allows to control the data buffer size, where the SDKdoes not.Except for the Vitamio library approach, all these methodshave several disadvantages. Using Vitamio led to stutteringvideo.

V. Extending Media Fragments

A new dimension has been proposed to Media Frag-ments. The trajectory dimension (traj key) describes arectangle’s dimensions and coordinates in function of time.Multiple rectangle-time pairs can be specified, and flagsspecify the transition behaviour between such pairs. Fig-ure 2 shows a visualisation for the Media Fragments URIt=7,70&traj=x,y,w,h;k;x,y,w,h;40;i;x,y,w,h, wherethe ’k’-flag and ’i’-flag stand for ’keep’ and ’interpolate’,respectively. The first one makes the current rectangle stayfixed until the next rectangle is specified. The second onemakes the rectangle gradually move and grow or shrink tothe dimensions of the next rectangle.

VI. Conclusions

We investigated how Media Fragments could be imple-mented on a mobile device, and chose Android as the mo-bile platform. A Media Fragments compatible video playerhas been created, and we investigated how data trafficcould be diminished, given that a video player wants toplay only a temporal fragment of a video. Furthermore,we proposed an extension to Media Fragments to supportspatial-temporal fragmentation.

References

[1] Raphael Troncy, Erik Mannens, Silvia Pfeiffer andDavy Van Deursen. Media Fragments URI 1.0 (ba-sic), W3C Proposed Recommendation, Available athttp://www.w3.org/TF/media-frags/.

[2] E. Wilde and M. Duerst. URI Fragment Identi-fiers for the text/plain Media Type, Available athttp://tools.ietf.org/html/rfc5147

[3] Adobe Solutions Network, PDF Open Param-eters, Available at http://partners.adobe.com/-public/developer/en/acrobat/PDFOpenParameters.pdf

[4] Ian Hickson. HTML5 - A vocabulary and associated APIsfor HTML and XHTML, W3C Working Draft, Available athttp://www.w3.org/TR/html5/.

Page 9: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

INHOUDSOPGAVE i

Inhoudsopgave

1 Inleiding 1

1.1 Situering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.1.1 ’Foreign objects’ versus ’first-class citizens’ . . . . . . . . . . . . . . . . . 1

1.1.2 Evolutie van het inbedden van media in webpagina’s . . . . . . . . . . . . 2

1.1.3 Bestaande URI-fragmentatiespecificaties . . . . . . . . . . . . . . . . . . . 3

1.1.4 URI-fragmentatie voor media-objecten . . . . . . . . . . . . . . . . . . . . 5

1.1.5 Introductie van de Media Fragments-specificatie . . . . . . . . . . . . . . 6

1.2 Probleemstelling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.3 Methodologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2 Literatuurstudie 9

2.1 Introductie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.2 Syntax en semantiek van Media Fragments . . . . . . . . . . . . . . . . . . . . . 10

2.2.1 t – Temporele as . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.2.2 xywh – Spatiale as . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.2.3 track – Track-as . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.2.4 id – Benoemde hoofdstukken . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.3 Historiek en huidige status van de specificatie . . . . . . . . . . . . . . . . . . . . 13

2.4 Verwerking van Media Fragments-URI’s . . . . . . . . . . . . . . . . . . . . . . . 14

2.5 Evaluatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3 Efficiente datatrafiek op het Android-besturingssysteem 17

3.1 Introductie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.2 Bestaande software-architectuur m.b.t. mediamanipulatie . . . . . . . . . . . . . 18

3.3 Mogelijkheden tot besparing van bandbreedte . . . . . . . . . . . . . . . . . . . . 19

Page 10: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

INHOUDSOPGAVE ii

3.3.1 Wegschrijven naar een bestand . . . . . . . . . . . . . . . . . . . . . . . . 19

3.3.2 FFmpeg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.3.3 Proxyserver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3.3.4 File spoofing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3.3.5 Andere mediabibliotheken . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3.4 Conclusie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

4 Ontwikkelen van een Media Fragments URI-parser 27

4.1 Algemeen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

4.2 Architectuur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

4.3 Parse-algoritme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

4.4 Unit tests en logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4.5 Broncode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

5 Ontwikkelen van een compatibele mediaspeler 35

5.1 Requirements en features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

5.2 Algemene app-levenscyclus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

5.3 Implementatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

5.4 Broncode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

6 Uitbreiding van de Media Fragments-specificatie 41

6.1 Spatiaal-temporele fragmentatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

6.1.1 Motivatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

6.1.2 Invoering van het traj-sleutel-waardepaar . . . . . . . . . . . . . . . . . . 42

6.1.2.1 Vereisten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

6.1.2.2 Ontwerp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

6.1.2.3 Notatie in het URI-fragment . . . . . . . . . . . . . . . . . . . . 44

6.1.3 Implementatie in de parser . . . . . . . . . . . . . . . . . . . . . . . . . . 45

6.1.4 Implementatie in de videospeler . . . . . . . . . . . . . . . . . . . . . . . . 45

6.2 Andere uitbreidingsmogelijkheden . . . . . . . . . . . . . . . . . . . . . . . . . . 46

7 Conclusies 48

Bijlagen 49

Page 11: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

INHOUDSOPGAVE iii

A Software Development Kit (SDK) 50

B Native Development Kit (NDK) 52

C Java Native Interface (JNI) 54

D FFmpeg 56

E Traject-URI formaatspecificatie 58

Bibliografie 59

Lijst van figuren 61

Lijst van tabellen 62

Page 12: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

Lijst van afkortingen

HTML HyperText Markup Language

HTTP Hypertext Transfer Protocol

IDE Integrated Development Environment

JNI Java Native Interface

NDK Native Development Kit

NPT Normal Play Time

PCM Pulse Code Modulation

PDF Portable Document Format

SDK Software Development Kit

SMPTE Society of Motion Picture and Television Engineers

URI Uniform Resource Locator

VM Virtual Machine

Page 13: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

INLEIDING 1

Hoofdstuk 1

Inleiding

1.1 Situering

1.1.1 ’Foreign objects’ versus ’first-class citizens’

In het hedendaagse weblandschap spreken we over ’first-class citizens’ en ’foreign objects’.

Hiermee bedoelt men dat bepaalde objecten wel en andere dan weer niet beschouwd worden

als een volwaardig onderdeel van het weblandschap. Dit komt omdat de HTML-specificatie oor-

spronkelijk ontwikkeld was om tekst weer te geven op een geordende manier, en geen rekening

hield met het al dan niet ingebed weergeven van allerlei objecten zoals PDF-bestanden, applets,

audio en video.

Het ontwikkelen en toevoegen van plugins maakte dit later wel mogelijk. Flash is zo’n plugin,

en YouTube1 is een zeer goed voorbeeld van een website die hiervan gebruik maakt om video’s

in zijn webpagina in te bedden en af te spelen. Tot januari 2010 was een Flash-installatie

noodzakelijk om er video’s te kunnen bekijken. Sindsdien is er ook een HTML5-experiment

bezig, waarbij videoplayback niet langer steunt op Flash. Gebruikers kunnen echter nog steeds

de keuze maken tussen beide technologieen.

Plugins zijn eigenlijk een vreemde eend in de bijt; zij breiden de mogelijkheden van een browser

uit naar zaken die niet in de HTML-specificatie zijn opgenomen. Objecten die van dergelijke

plugins afhangen, zoals audio en video, of een PDF-viewer of een Java-applet, worden ’foreign

objects’ genoemd.

1http://youtube.com

Page 14: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

1.1 Situering 2

1.1.2 Evolutie van het inbedden van media in webpagina’s

’Foreign objects’, in het bijzonder audio- en video-objecten, konden voor het bestaan van

HTML5 ingeladen worden in een webpagina m.b.v. de <embed>-tag in de broncode. De

plugin gelinkt met het MIME-type van het gerefereerd object, was dan verder verantwoordelijk

voor de correcte weergave van de inhoud van deze tag. Een object inbedden met MIME-type

application/x-shockwave-flash geeft bijvoorbeeld aan dat de Flash-plugin vereist is om dat

object weer te geven.

Het volgend voorbeeld toont het gebruik van de <embed>-tag aan voor het inbedden van een

Flash-video. Het stukje code werd uit de broncode van een YouTube-pagina2 geplukt (de waarde

van het flashvars-attribuut werd weggelaten voor het overzicht te bewaren):

Voorbeeld 1 (YouTube Flash player - <embed>)

<embed type=” app l i c a t i o n /x−shockwave−f l a s h ” s r c=”http :// s . ytimg . com/yt/←↩

swfbin /watch as3−v f l−u99wM. swf ” width=”640” id=”movie p layer ” he ight=”←↩

390” f l a s h v a r s=” . . . ” a l l ow s c r i p t a c c e s s=”always ” a l l ow f u l l s c r e e n=” true ” ←↩

bgco lo r=”#000000”>

De <embed>-tag werd echter in 1995 door de Netscape-browser geıntroduceerd3 en was voor

HTML5 nooit opgenomen in een HTML-specificatie [6, 2]. De meeste browsers ondersteunen

het gebruik van deze tag wel, maar ’officieel’ is het dus zeker niet: een webpagina die van deze

tag gebruik maakt, zal niet correct valideren met de gekende W3C-validator4.

De reden voor de introductie van deze ’bastaard-tag’ kan worden verklaard door de onvol-

maaktheid van de toenmalige HTML-specificatie en daarom werd met HTML 4.0 de <object>-

tag ingevoerd in 1997. In de specificatie van HTML 4.0 staat letterlijk:

Previous versions of HTML allowed authors to include images (via IMG) and applets

(via APPLET). These elements have several limitations:

� They fail to solve the more general problem of how to include new and future

media types. (...)

2http://www.youtube.com/watch?v=cieYQ_8JUmQ3http://1997.webhistory.org/www.lists/www-talk.1995q3/0578.html via http://www.webmonkey.com/

2008/09/history_of_img_and_embed_tags/4http://validator.w3.org/

Page 15: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

1.1 Situering 3

To address these issues, HTML 4.0 introduces the OBJECT element, which offers

an all-purpose solution to generic object inclusion. (...)

Het volgend voorbeeld toont hoe een YouTube-video op een correcte manier kan worden ingebed

gebruik makend van de <object>-tag.

Voorbeeld 2 (YouTube Flash player - <object>)

<ob j e c t type=” app l i c a t i on /x−shockwave−f l a s h ” s t y l e=”width :425 px ; he ight :350←↩

px ; ” data=”http ://www. youtube . com/v/7 6B6vwE83U”><param name=”movie” ←↩

value=”http ://www. youtube . com/v/7 6B6vwE83U” />

</ ob j e c t>

Tot hier toe dienden audio en video nog steeds door een plugin te worden verzorgd, zij het sinds

HTML 4.0 het best via de <object>-tag. Daar brengt HTML5 verandering in.

Eerst nog een voorbeeld. Zoals gezegd in voorgaande subsectie, voert YouTube een experiment

uit waarbij de video’s niet langer steunen op Flash. De video uit Voorbeeld 1 kan inderdaad

bekeken worden in YouTube’s HTML5-beta5, en dan is de broncode van de webpagina als volgt:

Voorbeeld 3 (YouTube HTML5 player - <video>)

<video c l a s s=”video−stream” x−webkit−a i r p l a y=” al low ” s r c=”http :// o−o .←↩

p r e f e r r e d . belgacom−bru1 . v5 . l s c a che1 . c . youtube . com/videoplayback ? sparams←↩

=. . . ” data−youtube−id=”cieYQ 8JUmQ”></ video>

In Voorbeeld 3 staat een vrij nieuwe tag: HTML5 introduceert de <video>- en <audio>-tags.

D.w.z. dat deze types media door de uitgeklede browser gerenderd worden indien deze de

HTML5-specificatie correct en volledig implementeert; er zijn geen plugins nodig. Anders gezegd:

omdat audio en video m.b.v. deze twee tags onafhankelijk worden van plugins, zijn ze niet langer

’foreign objects’ maar ’first-class citizens’. Of toch niet?

1.1.3 Bestaande URI-fragmentatiespecificaties

Video en audio zijn inderdaad nog geen volwaardige ’first-class citizens’, want met de nieuwe

tags wordt nog steeds een volledig media-object gerefereerd. In contrast daarmee kunnen we

5http://www.youtube.com/html5

Page 16: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

1.1 Situering 4

MIME-type Voorbeeld Omschrijving

application/pdf ...book.pdf#page=34 Springt naar pagina 34 in book.pdf

text/html ...index.html#something Springt naar het element op de webpagina

met identifier “something”

text/plain ...text.txt#line=32,40 Selecteert lijnen 32 t.e.m. 40 in test.txt

Tabel 1.2: Bestaande URI-fragments voor bepaalde MIME-types

m.b.v. de <a>-tag naar webpagina’s, maar specifieker, naar onderdelen van die webpagina’s

linken indien we gebruik maken van een zogenaamd ’URI fragment’ [1].

Voorbeeld 4 (URI fragments voor MIME-type text/HTML)

<div id=” f i r s t ”> . . .</ div>

<div id=” second”>

<a h r e f=” index . html#f i r s t ”>This links to the div with id ' first '</a>

</ div>

De hash (#) in bovenstaand voorbeeld is het karakter waar het ’URI fragment’ of ’fragment

identifier’ begint. Wat na dit karakter komt, geeft aan waar er intern naar wordt gerefereerd

binnenin index.html, en dat is het div-element met identifier “first”. Als deze bestaat, dan

springt de browser na het klikken op de link naar deze plaats in de webpagina.

Algemeen gezien zijn webpagina’s infeite objecten met MIME-type text/html. Het zijn niet

de enige objecten die gefragmenteerd kunnen worden; enkele andere objecten met bijhorende

MIME-types worden gegeven in tabel 1.2. De populairste ’fragment identifier’ hoort echter bij

text/html. Voor alle MIME-types in de tabel zijn specificatiedocumenten beschikbaar [10, 5, 6].

Op YouTube is het mogelijk om video’s te laten starten vanaf een bepaald tijdstip op een URI-

gebaseerde manier.

Voorbeeld 5 (YouTube’s URI-gebaseerde mediafragmentatie)

http : // www . youtube . com/watch ?v=suRsxpoAc5w#t=01m14s

Page 17: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

1.1 Situering 5

Deze notatie (#t=00m00s) is niet gestandaardiseerd, en werkt naar alle waarschijnlijkheid enkel

op YouTube. De volgende sectie bespreekt deze problematiek: de afwezigheid van een gestan-

daardiseerde manier om media-objecten te fragmenteren.

1.1.4 URI-fragmentatie voor media-objecten

Video- en audio-objecten zijn nog steeds geen ’first-class citizens’. Met de <video>- en <audio>-

tags gespecificeerd in HTML5 kunnen we deze media wel inbedden in een webpagina zonder de

nood aan een plugin, echter is de mogelijkheid tot mediafragmentatie d.m.v. een URI-fragment

nog steeds afwezig.

URI-fragmentatie op objecten met MIME-type video/* en audio/* dient te gebeuren op een

nieuwe, andere manier; media is in de eerste plaats tijdsgebaseerd dus is het zinvol om deze bvb.

te fragmenteren op basis van tijdspunten.

De onmogelijkheid tot video- en audiofragmentatie in de HTML5-specificatie leidt tot de vol-

gende drie tekortkomingen:

� Het is onmogelijk om de video (automatisch) te laten starten of stoppen op gegeven tijds-

punten (temporele as);

� Bij video is het onmogelijk om te focussen op een zogenoemde ’region of interest’; d.w.z.

dat er een spatiaal gebied, veelal een rechthoek, wordt afgebakend en ’in de schijnwerpers

wordt gezet’ (spatiale as);

� Het is onmogelijk om enkel een bepaalde deelverzameling van alle beschikbare tracks

(video, audio, ondertiteling) af te spelen. Bvb. speel de video af met de Nederlandse

i.p.v. de Engelse audio (track-as).

In subsectie 1.1.3 werd vergeleken met het intern refereren van webpagina’s. Deze vergelijking

gaat op, omdat de context behouden blijft: een URI-fragment op zichzelf is zinloos. De URI die

refereert naar het volledig ongefragmenteerd mediabestand blijft steeds beschikbaar, net zoals

een webpagina ook volledig wordt ingeladen.

Video en audio zullen pas ’first-class citizens’ zijn wanneer ze zich niet langer als een black

box gedragen, m.a.w. als het mogelijk wordt om te refereren naar fragmenten hiervan. De

fragmentatie kan dan gebeuren op basis van eigenschappen van media-objecten: een temporeel

gebied, een spatiaal gebied, ...

Page 18: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

1.2 Probleemstelling 6

1.1.5 Introductie van de Media Fragments-specificatie

Om video en audio tot ’first-class citizens’ te promoveren moet URI-fragmentatie gespecificeerd

worden voor de overeenkomstige MIME-types.

Media Fragments is een specificatie met het oog op URI-gebaseerde fragmentatie van video en

audio [8]. Analoog met de voorbeelden uit tabel 1.2 wordt een mediafragment (waar media

staat voor video of audio) gerefereerd door een URI, waarvan het gedeelte voor de hash (#)

verwijst naar de zogenoemde ’primary resource’ (het eigenlijke object waarop fragmentatie wordt

toegepast) en het gedeelte achter de hash de ’fragment identifier’ is.

Voorbeeld 6 (Mediafragmentatie met Media Fragments)

<video s r c=”movie .mp4#t=10 ,20” />

<video s r c=”movie .mp4#xywh=100 ,100 ,480 ,360 ” />

Voorbeeld 6 geeft een voorbeeld van temporele fragmentatie (t) en spatiale fragmentatie (xywh).

Deze fragmentatie is inderdaad URI-gebaseerd [4]. De Media Fragments-specificatie wordt uit-

voerig besproken in hoofstuk 2.

1.2 Probleemstelling

Om Media Fragments te kunnen standaardiseren, moet de eenvoud, bruikbaarheid en implemen-

teerbaarheid ervan aangetoond worden.

Er zijn reeds implementaties gemaakt: als Firefox-plugin6, een parser voor Media Fragments-

URI’s in Javascript7, een webpagina die gebruik maakt van Javascript om de videospeler aan te

sturen8, en tenslotte een speler in HTML5 (dus met <video>-tag in de broncode!) en Flash9[7].

Temporele fragmentatie al geımplementeerd in Webkit, een open source browser engine10, zonder

het gebruik van plugins.

Er zijn echter nog geen implementaties op mobiele platformen. Deze apparaten beschikken

typisch over lagere bandbreedte wat hen minder geschikt maakt om lange video’s op te bekijken

6http://www.w3.org/2008/WebVideo/Fragments/code/plugin/7http://tomayac.com/mediafragments/mediafragments.html8http://www.annodex.net/~silvia/itext/mediafrag.html9http://ninsuna.elis.ugent.be/MediaFragmentsPlayer10https://bugs.webkit.org/show_bug.cgi?id=65838

Page 19: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

1.3 Methodologie 7

waarvan de gebruiker enkel een deel wil zien. Media Fragments kan hier een uitweg bieden:

door het opgeven van een URI-fragment weet de speler op voorhand welk deel van de video

moet gedownload worden. De bruikbaarheid van Media Fragments zou hierdoor aangetoond

kunnen worden.

Hoe meer implementaties van de specificatie, hoe meer wordt aangetoond dat Media Fragments

implementeerbaar en bruikbaar is. Een implementatie op een mobiel apparaat helpt dan ook

om Media Fragments een stap dichter te krijgen bij standaardisatie, gezien de specificatie dan

door een extra platform wordt ondersteund.

De Media Fragments-specificatie dient ook onderzocht te worden op uitbreidingen. Deze mogen

de specificatie niet te complex maken en er moet aangetoond worden dat zij van enig nut zijn.

De probleemstelling van deze masterproef is dus samengevat:

� Er is nood aan een implementatie van een videospeler op een mobiel apparaat, die de

specificatie ondersteunt.

� Er moet onderzocht worden hoe efficient met bandbreedte kan worden omgesprongen,

gegeven dat slechts een fragment van de video bekeken wordt.

� De specificatie moet worden onderzocht op uitbreidingen. Deze uitbreidingen dienen ook

geımplementeerd te worden.

1.3 Methodologie

Er wordt eerst uitgebreid kennis gemaakt met de Media Fragments-specificatie door het lezen

van artikels en de eigenlijke specificatie.

Het schrijven van de applicatie zal gebeuren op een Android-apparaat. Hiervoor werden ver-

schillende introducties en tutorials gelezen alvorens aan de slag te kunnen gaan. Er worden

verschillende methodes geımplementeerd en getest om de efficientie van het bandbreedtegebruik

te onderzoeken.

Er wordt een parser voor Media Fragments-URI’s geschreven. Deze parser wordt opgevat als

bibliotheek en zal gebruikt worden door de applicatie op het Android-platform.

De Media Fragments-specificatie wordt onderzocht op nuttige uitbreidingen. Er wordt bekeken

hoe deze uitbreidingen zich zullen vertalen in het URI-fragment, in welke mate deze botsen

Page 20: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

1.3 Methodologie 8

met de bestaande specificatie en hoe de uitbreidingen kunnen geımplementeerd worden in de

applicatie.

Page 21: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

LITERATUURSTUDIE 9

Hoofdstuk 2

Literatuurstudie

Zoals gezegd in hoofdstuk 1, zullen we de Media Fragments-specificatie implementeren in een

applicatie op Android. In de eerste plaats wordt de huidige Media Fragments-specificatie

bestudeerd en wordt bekeken hoe deze kan uitgebreid en eventueel verbeterd worden. Verder in

dit hoofdstuk bekijken we de bestaande media-architectuur op Android-aangestuurde appa-

raten en wordt onderzocht hoe en in welke mate we deze bestaande functionaliteit op het

Android-platform kunnen aanwenden om bandbreedte te besparen bij het afspelen van een

mediafragment, daar we typisch slechts een deel van de ’primary resource’ willen afspelen.

2.1 Introductie

Media Fragments is een specificatie die omschrijft hoe objecten met MIME-type video/* of

audio/* kunnen gefragmenteerd worden, gebaseerd op een URI. Zoals de MIME-types al doen

vermoeden, betreft het media-objecten.

Gegeven een door een URI gerefereerde ’primary resource’, in dit geval dus een video- of audio-

object, bekomen we een afgeleide video, respectievelijk audiotrack, die enkel en alleen bestaat

uit een fragment van het origineel. Zoals gezegd in vorig hoofdstuk, moet fragmentatie op

media gebeuren op een andere manier dan het gebeurt met objecten met een ander MIME-type.

Met een ’media fragment’ wordt dan ook een temporeel of spatiaal deelgebied of een selectie

van tracks bedoeld, afgeleid van de ’primary resource’; ook combinaties hiervan zijn toegestaan

binnen de Media Fragments-specificatie.

In de rest van deze sectie wordt de syntax en semantiek van Media Fragments toegelicht en volgt

Page 22: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

2.2 Syntax en semantiek van Media Fragments 10

een evaluatie van de huidige specificatie. Andere, voor deze masterproef niet relevante delen uit

de specificatie worden niet besproken; hiervoor wordt verwezen naar het specificatiedocument [8].

2.2 Syntax en semantiek van Media Fragments

Media Fragments specificeert ’fragments identifiers’ die bestaan uit een of meerdere door het

’&’-karakter gescheiden sleutel-waardeparen, waarvoor de notatie <sleutel>=<waarde> geldt.

Voorbeeld 7 (Media Fragments sleutel-waardeparen)

http : // example . com/movie . mp4#t=3,16&xywh=10 ,20 ,150 ,100

Er zijn hier twee sleutels: t en xywh. Ze hebben respectievelijk de waarden 3,16

en 10,20,150,100. http://example.com/movie.mp4 refereert naar de ’primary re-

source’ movie.mp4. Met de ’fragment identier’ t=3,16&xywh=10,20,150,100 wordt

een fragment afgeleid dat start op seconde 3 en eindigt op seconde 16. Bovendien

wordt enkel een deel van het totaalbeeld getoond: een rechthoek vanaf pixel (10,20),

150 pixels breed en 100 pixels hoog.

Er zijn 4 mogelijke sleutels: t (”temporele as”), xywh (”spatiale as”), track (”track-as”) en id.

Een waarde bestaat soms uit twee delen: de eenheid en het suffix. De eenheid is dan impliciet

of expliciet aanwezig. Zo is in voorbeeld 7 de waarde van de xywh-sleutel uitgedrukt in pixels,

omdat deze eenheid de standaard is, maar het spatiaal gebied (de rechthoek) kon evengoed in

percentages worden uitgedrukt.

Voorbeeld 8 (Media Fragments eenheden)

http : // example . com/movie . mp4#xywh=10 ,20 ,150 ,100

http : // example . com/movie . mp4#xywh=pixel : 10 ,20 ,150 ,100

Deze twee fragmenten zijn identiek aan elkaar, omdat pixel het standaardeenheid

is voor de sleutel xywh. Het suffix is gegeven door 10,20,150,100.

http : // example . com/movie . mp4#xywh=percentage : 25 , 25 ,50 ,50

Dit fragment toont een spatiaal gebied uit de ’primary resource’: een gecentreerde

rechthoek die de helft zo breed en de helft zo hoog is als de originele afmetingen. De

eenheid percentage moet er expliciet staan, want het is niet het standaardeenheid.

Page 23: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

2.2 Syntax en semantiek van Media Fragments 11

De syntax van een suffix kan verschillen naargelang de gebruikte eenheid.

In de volgende subdeelsecties wordt dieper ingegaan op elk van de vier mogelijke sleutels en

bijhorende eenheden (indien van toepassing). Voor details zoals exacte syntax van suffixen

wordt verwezen naar de Media Fragments-specificatie.

2.2.1 t – Temporele as

De temporele as is wellicht de belangrijkste. Hiermee kan een temporeel fragment van een

’primary resource’ worden afgeleid.

Algemeen is de syntax t=eenheid:a,b waarbij a en b tijdspunten zijn die het temporeel fragment

specificeren. Bij het weglaten van a wordt de begintijd van de ’primary resource’ bedoeld, en

analoog voor b de eindtijd. Voor de temporele as bestaan er drie soorten eenheden: npt, smpte

en clock.

� npt: dit staat voor Normal Play Time. Dit formaat wordt gebruikt als we de start-

en/of stoptijd van het fragment willen aangeven met een tijdsafzet vanaf het begin van de

’primary resource’. Dit is het standaardeenheid.

� smpte, smpte-25, smpte-30, smpte-30-drop: deze eenheden kunnen gebruikt worden

indien exacte framenauwkeurigheid vereist is. De verschillende nummers slaan op het

aantal frames per seconde in de video.

� clock: dit eenheid11 is van nut bij livestreams. Er wordt geen tijdsafzet meegegeven zoals

bij het npt-eenheid, maar een exacte datum en tijd waarop gestreamed werd.

Voorbeeld 9 (Media Fragments temporele as)

http : // example . com/movie . mp4#t=10 ,20

http : // example . com/movie . mp4#t=npt : 15

http : // example . com/movie . mp4#t=npt : , 1 7

Het eerste fragment speelt de video af vanaf seconde 10 en eindigt het afspelen op

seconde 20. Het tweede fragment start op seconde 15 en stopt op het einde van de

video en het derde fragment start bij het begin en stopt op seconde 17.

11idem

Page 24: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

2.2 Syntax en semantiek van Media Fragments 12

2.2.2 xywh – Spatiale as

Met deze sleutel kan een spatiaal gebied worden geextraheerd uit een video.

Er zijn juist twee eenheden:

� pixel: dit is de standaardeenheid en het drukt de positie vanaf de linkerbovenhoek en

grootte van het spatiaal gebied uit in pixels.

� percent: drukt de positie vanaf de linkerbovenhoek en grootte van het spatiaal gebied uit

in percentages van de originele breedte en hoogte.

Een voorbeeld voor de spatiale as werd al gegeven in voorbeeld 8.

2.2.3 track – Track-as

De track-as selecteert een track uit het mediabestand, zoals een video-, audio- of ondertitel-

ingstrack.

Deze sleutel kent geen eenheden. De bijhorende waarden moeten uiteraard wel terug te vinden

zijn in de gerefereerde video- of audiocontainer, zodat een bestaande track kan geextraheerd

worden.

Voorbeeld 10 (Media Fragments temporele as)

http : // example . com/movie . mp4#track=video&track=subtitle

Dit fragment selecteert de tracks met namen ’video’ en ’subtitle’ uit de videocon-

tainer.

2.2.4 id – Benoemde hoofdstukken

Deze waarde van de id-sleutel is een identifier, die in de videocontainer de naam of het nummer

is van een hoofdstuk (in een film, bvb.), wat dus leidt tot een temporeel fragment.

Deze sleutel kent net zoals track geen eenheden.

Voorbeeld 11 (Media Fragments id)

http : // example . com/movie . mp4#id=chapter−1

Dit extraheert de sectie uit de video met naam ’chapter-1’.

Page 25: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

2.3 Historiek en huidige status van de specificatie 13

Status Datum publicatie

W3C Working Draft 17.12.2009

W3C Working Draft 13.04.2010

W3C Working Draft 24.06.2010

W3C Working Draft 17.03.2011

W3C Candidate Recommendation 01.12.2011

W3C Proposed Recommendation 15.03.2012

Tabel 2.1: Historiek van de Media Fragments-specificatie

2.3 Historiek en huidige status van de specificatie

De specificatie is al sinds 2009 in ontwikkeling en heeft al verschillende stadia doorgemaakt:

’Working Draft’, ’Candidate Recommendation’ en ’Proposed Recommendation’. Op de W3C-

website12 vinden we een (Engelstalige) uitleg voor deze termen.

� ’Working Draft’ is de indicatie dat de specificatie beschreven in het document nog in

ontwikkeling is.

� ’Candidate Recommendation’ indiceert dat de specificatie stabiel is. Er worden implemen-

taties en feedback verwacht.

� ’Proposed Recommendation’ duidt aan dat er implementaties zijn gemaakt. De specificatie

kan nu geevalueerd worden.

De verschillende stadia voor de Media Fragments-specificatie zijn weergegeven in tabel 2.1.

Media Fragments bevindt zich in het ’Proposed Recommendation’-stadium. In deze versie van

de specificatie zijn niet alle hierboven beschreven assen en eenheden nog opgenomen. De meest

recente versie van Media Fragments specificeert volgende assen:

� Temporele as (t): enkel npt-eenheid

� Spatiale as (xywh): zowel percent- als pixel-eenheid

De temporele prefixen clock en smpte en varianten, de track- en id-as zijn dus niet langer

opgenomen.

12http://www.w3.org/Consortium/Process/Process-19991111/tr.html

Page 26: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

2.4 Verwerking van Media Fragments-URI’s 14

2.4 Verwerking van Media Fragments-URI’s

Het gebruik van Media Fragments staat een videospeler toe om efficienter gebruik te maken van

bandbreedte. De speler weet namelijk meteen op welke posities het afspelen begint en eindigt;

hierdoor hoeft enkel die data gedownload te worden, die overeenstemt met het afgebakend tijds-

gebied.

Deze beschouwing is beschreven in een Working Draft van de Media Fragments-specificatie [9].

Het omschrijft op welke manier een videospeler de juiste data kan binnenhalen, ook wanneer het

zelf niet in staat is om het tijdsgebied te vertalen in byte-offsets. De onderhandelingen tussen

videospeler (of abstracter, de ’client’ of ’User Agent’) en server zijn beschreven in het document

met HTTP en RTSP. De eenvoudigste situatie wordt getoond in voorbeeld 12.

Voorbeeld 12 (Verbeterd bandbreedtegebruik)

Een webpagina heeft een video ingebed die verwijst naar de volgende URI:

http : // www . example . com/video . ogv#t=10 ,20

De videospeler weet hoe het het opgegeven tijdsgebied kan vertalen naar byte-offsets,

heeft de video niet in zijn buffer en stuurt een HTTP-request naar de server:

GET /video . ogv HTTP /1 .1

Host : www . example . com

Accept : video/*

Range : bytes=19147−22890

De Range-parameter geeft aan dat niet de gehele resource moet teruggestuurd wor-

den, maar enkel het aangegeven bytebereik. Als alle randvoorwaarden voldaan zijn

(bestand aanwezig, aangevraagd bytebereik bestaat, ...) dan zal de server antwoor-

den met een Partial Content-response:

HTTP /1 .1 206 Partial Content

Accept−Ranges : bytes

Content−Length : 3743

Content−Type : video/ogg

Content−Range : bytes 19147−22880/35614993

Etag : ”b7a60−21f7111−46f3219476580”

{binary data}

Voorbeeld 12 is letterlijk overgenomen uit de specificatie en beschrijft het scenario wanneer

Page 27: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

2.5 Evaluatie 15

de User Agent (UA) het bytebereik zelf kan bepalen en het fragment voor de eerste keer wordt

aangevraagd. Figuur 2.1 toont de communicatie tussen verschillende actoren voor dit voorbeeld.

Ook deze figuur is overgenomen uit een Working Draft van de specificatie [9].

Figuur 2.1: Het opvragen van de nodige data voor een temporeel fragment.

2.5 Evaluatie

De Media Fragments-specificatie tracht uniformiteit te krijgen in het weblandschap m.b.t. URI-

gebaseerde fragmentatie op media-objecten, net zoals er andere types objecten bestaan waar

URI-gebaseerde fragmentatie al op gespecificeerd is. In combinatie met HTML5 geeft dit enige

voordelen:

� Het renderen van audio en video gebeurt door de browser waarin deze media wordt

afgespeeld en niet langer door een plugin. Ontwikkelaars kunnen meteen ondersteuning

voorzien en niet te hoeven vertrouwen op een plugin waar zij geen controle over hebben.

Dit kan de stabiliteit van browsers alleen maar ten goede komen.

� Met een Media Fragments-URI die rechtstreeks of onrechtstreeks verwijst naar een tem-

poreel fragment, hoeft nooit teveel data te worden gedownload. Indien het eindtijdstip

van het fragment werd meegegeven in de URI, kan berekend worden welke data precies

Page 28: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

2.5 Evaluatie 16

moet gedownload worden om dat fragment af te spelen. Dit bespaart datatrafiek i.v.m.

bufferingstechnieken.

� De combinatie van HTML5 en Media Fragments leidt tot een korte, krachtige en betekenisvolle

notatie in de broncode van een webpagina.

� Uniformiteit m.b.t. URI-gebaseerde fragmentatie.

Toch kan de Media Fragments-specificatie nog uitgebreid worden.

� Spatiale fragmentatie is statisch. De rechthoek blijft gedurende het ganse fragment staan

en beweegt niet mee. Er is dus nog plaats in de specificatie voor een spatiaal-temporele

as.

� Een rechthoek kan voldoende blijken in veel gevallen, maar er zijn situaties denkbaar

waarin andere, of meerdere vormen tegelijkertijd nuttig blijken.

Page 29: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

EFFICIENTE DATATRAFIEK OP HET ANDROID-BESTURINGSSYSTEEM 17

Hoofdstuk 3

Efficiente datatrafiek op het

Android-besturingssysteem

3.1 Introductie

De website voor Android-ontwikkelaars omschrijft Android als volgt13:

Android is a software stack for mobile devices that includes an operating system,

middleware and key applications.

Het programmeren op Android gebeurt hoofdzakelijk in de programmeertaal Java. Android

bevat een VM, ’Dalvik’, die de Java-apps draait. Voor het schrijven van pure Java-apps is de

SDK (zie bijlage A) voldoende.

Voor stukken code die zeer performant moeten zijn, kan in C of (gelimiteerd) in C++ worden

geprogrammeerd. Hierbij komt Android’s NDK van pas (zie bijlage B). Het aanspreken van

C-code vanuit de Java-app gebeurt dan met JNI (zie bijlage C).

Het ontwikkelen van een Media Fragments-applicatie (“app”) op een door Android aangestuurd

apparaat vereist vooraf het onderzoeken van de bestaande software-architectuur m.b.t. het

manipuleren van media. De app moet namelijk Media Fragments-URI’s syntactisch, maar ook

semantisch kunnen interpreteren, en voor dat laatste is soms metadata van het af te spelen

mediabestand vereist zoals de afmetingen van een video.

13http://developer.android.com/guide/basics/what-is-android.html

Page 30: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

3.2 Bestaande software-architectuur m.b.t. mediamanipulatie 18

Verder moet worden nagegaan in welke mate toegang en controle kan worden verkregen over func-

tionaliteit die verborgen is in Android’s bovenste laag – de SDK – bijvoorbeeld de manier waarop

videodata wordt gedownload of gestreamed met het oog op bandbreedtebesparing. Hierbij kan

het nuttig zijn om toegang te hebben tot de data zelf (de bits).

3.2 Bestaande software-architectuur m.b.t. mediamanipulatie

In de SDK vinden we slechts enkele klassen terug die enigszins de benodigde functionaliteit

bieden: MediaMetadataRetriever, AudioTrack en MediaPlayer.

� MediaMetadataRetriever is in staat om metadata uit mediabestanden te halen. Dit laat

toe om Media Fragments-URI’s semantisch te interpreteren, zoals bijvoorbeeld nodig is bij

het gebruik van de track- en id-sleutels (zie subsecties 2.2.3 en 2.2.4).

� AudioTrack is een klasse die toelaat om audio af te spelen, waarbij de input bestaat uit

bits (en geen abstractie hiervan zoals bestanden, URI’s, ...). Dit maakt het mogelijk om

het binnentrekken van de data los te koppelen van het afspelen van de media. Enig nadeel:

de audiodata moet met PCM14 geencodeerd zijn. Bovendien gaat het hier enkel om audio,

dus voor video biedt dit geen oplossing.

� MediaPlayer laadt media in, speelt het af en voorziet in start-, stop- en doorspoel-

mogelijkheden, waarbij technische details verborgen zijn. Via deze klasse kan ook ele-

mentaire metadata worden opgevraagd, zoals afmetingen van een video.

Bij enkele vroege tests met de MediaPlayer-klasse, leren we dat Android’s ingebouwde media-

speler enkel data downloadt vanaf het punt dat er wordt afgespeeld. Echter, de speler stopt niet

met downloaden tot het einde van de video of audiotrack bereikt is. Indien een temporeel frag-

ment werd aangevraagd, is dit zeer ongewenst gedrag m.b.t. de lagere bandbreedte die typisch

is bij mobiele apparaten (bvb. via het GSM-netwerk). Of, bij het bekijken van een temporeel

fragment van een video in hoge kwaliteit, zal een enorme hoeveelheid data nutteloos gedownload

worden.

Uit al het voorgaande trekken we 3 conclusies:

14Pulse Code Modulation: een ongecomprimeerd audioformaat dat op Windows meestal voorkomt met .wav-

extensie

Page 31: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

3.3 Mogelijkheden tot besparing van bandbreedte 19

Header Header

Fragmentdata Fragmentdata

0000...

...0000

Figuur 3.1: Niet gedownloade data wordt vervangen door nullen.

� Het semantisch interpreteren van Media Fragments-URI’s is mogelijk, gegeven de URI zelf

en de MediaMetadataRetriever-klasse;

� De app kan gebruik maken van MediaPlayer voor het afspelen van video;

� Bandbreedtebesparing wordt moeilijk met de SDK en er moet dus verder gezocht worden

naar oplossingen hiervoor.

3.3 Mogelijkheden tot besparing van bandbreedte

Wellicht het belangrijkste aspect van Media Fragments is de temporele fragmentatie. In de

achtergrond zou enkel die data uit het media-object nodig zijn die overeenstemt met het aangevraagd

fragment.

De voorgaande subsectie leert ons echter dat bandbreedte besparen moeilijk wordt met de SDK.

In de volgende subsecties worden enkele pogingen besproken om dit probleem op te lossen.

3.3.1 Wegschrijven naar een bestand

Het idee bestaat eruit om, gegeven een niet-lokale mediabron, enkel de header data te down-

loaden, gevolgd door de nodige data die overeenstemt met het aangevraagd temporeel fragment.

Vervolgens wordt op het Android-apparaat exact hetzelfde bestand weggeschreven maar de niet-

gedownloade data wordt vervangen door nullen (zie figuur 3.1).

Er werd nagegaan of een Android-apparaat in staat was om het ’half’ bestand nog steeds af te

spelen binnenin het temporeel gebied. Met het Java-programma Isoviewer15 (gebouwd op de

’mp4parser’-bibliotheek) werd de algemene structuur van een MP4-bestand bestudeerd[3], en op

welke manier in dit formaat de blokken video- en audiodata op metaniveau worden gerefereerd

15http://code.google.com/p/mp4parser/

Page 32: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

3.3 Mogelijkheden tot besparing van bandbreedte 20

in de header. Eens vertrouwd met deze container kon m.b.v. een hexadecimale editor een

groot aantal bytes vervangen worden door nulbytes. Belangrijk hierbij is dat we vervangen tot

juist aan de positie waar een datablok start. Er kan namelijk niet van eender waar in de data

begonnen worden met decoderen - men moet steeds starten van een zogenaamd ’random access

point’. Dit is een videodatablok dat decodeert tot een volledig videoframe, en niet afhangt van

voorgaande of volgende frames. In de header van een MP4-bestand worden de byte-offsets naar

deze random access points in een gecomprimeerde lijst opgeslaan - handig voor het snelzoeken in

een video. Met deze lijst bepalen we op welke posities data kan worden vervangen door nullen.

Er ontstaat dus een nieuw bestand met een groot aantal nutteloze bytes. Bij het afspelen op

het Android-apparaat is het belangrijk dat we de video eerst ’doorspoelen’ naar het temporeel

fragment, en dan pas laten afspelen. De videospeler-app zou kunnen crashen op plaatsen in het

bestand waar nullen de originele data vervangen.

Het resultaat hiervan is dat het werkt. Er kan afgespeeld worden binnenin het temporeel frag-

ment; daarbuiten zal de speler crashen.

Als we het extraheren van de data voor het temporeel fragment nu automatiseren, hebben we

infeite een oplossing voor het bandbreedteprobleem. Echter zijn er enkele grote nadelen bij deze

aanpak:

� Het is niet formaat-onafhankelijk. Er moet voorzien worden in een implementatie om

elk door Android ondersteund formaat te kunnen analyseren om zo de juiste databytes

te extraheren. Uiteraard kan beroep worden gedaan op verschillende Java-bibliotheken,

maar of bevatten deze bugs, of bestaan ze gewoon niet voor een bepaald formaat, of

kunnen deze niet op Android worden gebruikt; het laatste heeft te maken met het feit dat

op Android-apparaten de Dalvik VM wordt gebruikt en niet een uitgebreidere VM zoals

op computers.

� Het feit dat er een nieuw bestand moet gecreeerd worden maakt deze methode traag. Niet

alleen moeten de nodige bytes eerst worden weggeschreven omdat we afspelen van een

bestand, maar ook de nutteloze nulbytes. In het geval dat het temporeel gebied zich verop

in de video situeert, ontstaat er een groot aantal nutteloze bytes die allen moeten worden

opgeslaan. Dit scenario is bijvoorbeeld sowieso onhaalbaar bij video’s met hoge resolutie

of van lange duur.

Page 33: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

3.3 Mogelijkheden tot besparing van bandbreedte 21

� Op mobiele apparaten is het beschikbaar geheugen typisch klein, wat het wegschrijven van

nutteloze data nog onaantrekkelijker maakt.

Het eerste probleem i.v.m. formaatonafhankelijkheid zou eventueel kunnen opgelost worden met

FFmpeg. Aangezien deze C-bibliotheek zowat alle gekende videoformaten ondersteunt, kunnen

we metadata op een abstracte manier ophalen. Dit wordt besproken in subsectie 3.3.2.

3.3.2 FFmpeg

FFmpeg is een framework geschreven in C voor het afspelen, coderen, decoderen, transcoderen,

muxen, demuxen, filteren, ... van video. Het is gratis en biedt ondersteuning voor vrijwel alle

gangbare formaten en codecs. Het steunt hierbij op de mogelijkheden van verschillende libraries

zoals onder meer libavcodec en libavformat.

FFmpeg zou de oplossing kunnen zijn voor het bandbreedteprobleem. Via de libraries is het

namelijk mogelijk om alle metadata uit een video te extraheren op een abstracte en formaaton-

afhankelijke manier, in tegenstelling tot Android SDK waar enkel de niet-technische informatie

uit de header toegankelijk is. Met deze metadata kan dan bepaald worden waar de data voor

het aangevraagd temporeel fragment zich bevindt in het videobestand.

Er stellen zich wel enkele problemen:

� FFmpeg is geschreven in C. Kunnen we dit framework compileren voor een Android device?

� Kunnen we de FFmpeg-methodes aanspreken vanuit de Java-app?

� Kunnen we de juiste metadata extraheren? En verder: gezien we nutteloze data niet

downloaden, moet eerst de gestripte header geanalyseerd worden. Zal FFmpeg correct

werken met een videobestand waarvan enkel de header overblijft?

FFmpeg compileren voor gebruik onder Android werd al gedaan16, net zoals het aanspreken van

de code vanuit de Java-kant van de app17. In de testopstelling werd de native code gecompileerd

naar armeabi-architectuur.

Metadata-extractie met FFmpeg werkt goed op complete bestanden, maar niet op bestanden

die bestaan uit enkel headerdata. Alle statische metadata zoals titel, auteur, ... kan steeds

16http://www.roman10.net/how-to-build-ffmpeg-for-android/17http://www.roman10.net/how-to-build-android-applications-based-on-ffmpeg-by-an-example/

Page 34: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

3.3 Mogelijkheden tot besparing van bandbreedte 22

uitgelezen worden, maar de applicatie crasht echter bij het berekenen van de data-offset van

het temporeel fragment. FFmpeg itereert namelijk door de data, en vereist dat deze data ook

effectief bestaat. Bij een test waarbij de data vanaf het vijfde random access point uit een

videobestand verwijderd werd, crashte FFmpeg inderdaad in de 5de iteratie. Het verwijderen

van deze data gebeurde net zoals in vorige subdeelsectie door gebruik te maken van Isoviewer

en een hexadecimale editor.

Voor meer details i.v.m. het gebruik van FFmpeg in Android-apps wordt verwezen naar Bijlage D.

FFmpeg biedt dus geen uitweg voor het bandbreedteprobleem. Op dit punt werd beslist om

FFmpeg te laten voor wat het is. Het aanpassen van FFmpeg-code is enerzijds een delicate en

tijdrovende operatie, anderzijds ligt het te ver van het eigenlijke doel van deze masterproef.

3.3.3 Proxyserver

Een andere mogelijkheid is het implementeren van een valse HTTP-server op het Android-

apparaat. Wanneer de te bouwen applicatie een Media Fragments URI krijgt, zal hij de in-

gebouwde videocomponent uit de SDK een herbouwde URI meegeven die verwijst naar een

onbestaand bestand op de valse server. Op het moment dat de ingebouwde videocomponent

de video progressief wil downloaden (afspelen tijdens het downloaden), ’onderschept’ de valse

server deze aanvraag. Aangezien de valse server wordt opgezet door de app, kent deze de Media

Fragments parameters die werden meegegeven met de oorspronkelijke URI. De valse server zal

dan enkel die bytes downloaden die overeenstemmen met het aangevraagd temporeel fragment;

vraagt de ingebouwde videocomponent bytes aan buiten dat bereik dan stuurt de valse server

een HTTP-bericht terug dat dit niet mogelijk is. Figuur 3.2 illustreert deze aanpak.

Bij deze aanpak zijn er opnieuw enkele problemen.

� De ingebouwde videocomponent kan zich onverwacht gedragen, als deze niet de data krijgt

waar om gevraagd werd. Die zou eeuwig kunnen wachten, of simpelweg crashen. In beide

gevallen zal de applicatie onbruikbaar zijn. Bovendien kan de ingebouwde videocomponent

veranderen met elke update aan het Android besturingssysteem. Rommelen met de manier

waarop de ingebouwde videospeler data downloadt, lijkt dus niet aangewezen.

� Een bijkomend probleem is dat de valse server moet weten hoe het bytebereik berekend

wordt, gegeven een temporeel gebied in de video. Dit is formaatafhankelijk en dus zou

Page 35: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

3.3 Mogelijkheden tot besparing van bandbreedte 23

http://localhost/movie.mp4

seekto()

onSeekCompleted-event

data 0-100000

data 0-100000

data 0-100000

onBufferingUpdate-event

data 100000-165000

data 100000-165000

data 100000-165000

data 100000-200000

onBufferingUpdate-event

getCurrentPosition()

position

getCurrentPosition()

position

stop()

start()

onPrepared-event

data 0-100000

A:App B:Videocomponent C:Proxyserver D:example.com

Figuur 3.2: De lokale proxyserver (vandaar het localhost-adres) zorgt ervoor dat

enkel de data wordt gedownload die overeenstemt met het aangevraagd temporeel

fragment. Alvorens de app aan de videocomponent vraagt om te starten met

afspelen, laat die hem eerst doorspoelen naar het temporeel fragment, zodat er

zeker niet afgespeeld wordt van locaties waar geen data beschikbaar is. De app

vraagt regelmatig de huidige afspeellocatie op. Op basis hiervan kan de app

beslissen om te stoppen met afspelen, als het einde van het temporeel fragment

bereikt zou zijn.

Page 36: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

3.3 Mogelijkheden tot besparing van bandbreedte 24

de valse server alle formaten moeten ondersteunen die Android kan afspelen. Dit zou

duplicatie van functionaliteit betekenen, aangezien ingebouwde videocomponent dit al kan

(maar dus ook controleert hoe de videodata gedownload wordt).

Het probleem i.v.m. formaatonafhankelijkheid kan eventueel opgelost worden met een iets

gewijzigde aanpak. De valse server hoeft niet langer exact die data te downloaden die overeen-

stemt met het temporeel fragment, maar zou bijvoorbeeld steeds een vaste hoeveelheid data

kunnen bufferen zolang het temporeel fragment afspeelt. Op die manier kan er hoogstens zoveel

data nutteloos gedownload worden als de buffer groot is, want het bufferen stopt als het einde

van het temporeel fragment bereikt is tijdens het afspelen.

3.3.4 File spoofing

Zou het niet mogelijk zijn om de videospeler om de tuin te leiden door te verwijzen naar een

virtueel (video)bestand? Hiermee bedoelen we dat er een object wordt gecreeerd dat zich tegen-

over de videocomponent gedraagt als een echt bestand, maar we laten het intern functioneren

zoals we het willen: de bytes halen we niet op vanuit een opslagmedium (zoals intern geheugen,

een SD-kaart, ...), maar via het netwerk m.b.v. de URI die verwijst naar de video. Als de

videocomponent dan data wil lezen uit dit virtueel bestand, sturen we de juiste bytes indien het

bytes betreft uit het overeenstemmend temporeel gebied, en nulbytes indien dit niet zo is.

Hiervoor werd de broncode van de klassen File en FileDescriptor bestudeerd18, maar telkens

stoten we tegen hetzelfde probleem: gegeven een referentie naar een bestand (afgeleid van File

of FileDescriptor), zal Android in de native OS-laag de data effectief trachten op te halen uit

het onbestaand bestand. Het is dus onmogelijk om de calls te onderscheppen in de SDK-laag.

Infeite is dit een variant op de methode met een proxyserver zoals in bovenstaande subdeelsectie,

maar deze manier werd het eerst uitgeprobeerd. Waar de HTTP-server vervangbaar is, is dat

voor een bestand onmogelijk.

3.3.5 Andere mediabibliotheken

De in Android’s SDK voorziene bibliotheken die ontwikkelaars dienen te gebruiken om video in

te bouwen in apps, is zeer afgesloten; het is bij wijze van spreken enkel mogelijk om een video

18Android is open source. De broncode kan gedownload worden vanaf http://source.android.com/source/

downloading.html

Page 37: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

3.4 Conclusie 25

te starten en te stoppen en controle over interne procedures is afgeschermd.

We zoeken naar een andere, uitgebreidere bibliotheek en vinden Vitamio19. Deze is gebaseerd op

de bestaande Android-architectuur, maar breidt deze uit met functionaliteit zoals ondersteuning

voor ondertitels en de mogelijkheid tot het instellen van de buffergrootte. De klassen in deze

bibliotheek hebben heel wat gelijkenissen met die uit de media-architectuur uit Android SDK.

Vitamio is gebaseerd op FFmpeg. Om deze bibliotheek te kunnen gebruiken moet er een aparte

’plugin’ geınstalleerd worden die toelaat om media te decoderen. M.b.v. de bibliotheek kan deze

plugin dan aangesproken worden.

Bij tests met Vitamio vallen de resultaten echter tegen: het beeld is niet synchroon met het

geluid en het beeld is ook niet vloeiend in tegenstelling tot de standaard mediaspeler. Dit ligt

aan twee factoren: ten eerste wordt gebruik gemaakt van FFmpeg, waar met de standaard

Android SDK directer op de hardware wordt gewerkt en ten tweede gebeurde de test op een

low-end apparaat.

Dit maakt Vitamio ongeschikt om te gebruiken.

3.4 Conclusie

Android geeft ons genoeg instrumenten om een Media Fragments-app te schrijven, maar wilt

het de ontwikkelaar gemakkelijker maken (of juist moeilijker?) door zo weinig mogelijk controle

te geven over de technische details in de achtergrond.

Het bandbreedteprobleem kan telkens herleid worden naar andere problemen. Niettemin zijn er

wel enkele oplossingen mogelijk.

� Een media-object eerst wegschrijven naar een bestand kent te veel nadelen: te traag,

foutgevoelig en niet geschikt op mobiele apparaten met gelimiteerde opslagcapaciteit.

� De FFmpeg-methode werkt niet met headerdata zonder bijhorende videodata. Het aan-

passen van FFmpeg-code is te complex en kan formaatafhankelijkheid introduceren.

� Een proxyserver kan werken, en heeft het voordeel dat niet eerst het (partieel) media-object

moet gedownload worden: streamen blijft mogelijk.

19http://vov.io/vitamio/

Page 38: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

3.4 Conclusie 26

� File spoofing is onmogelijk, tenzij broncode van het Android OS wordt aangepast. Dit

laatste zorgt ervoor dat de app alleen zou kunnen draaien op apparaten met die aangepaste

broncode, wat niet wenselijk is.

� De Vitamio-bibliotheek was zeker het proberen waard maar presteert niet goed.

Page 39: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

ONTWIKKELEN VAN EEN MEDIA FRAGMENTS URI-PARSER 27

Hoofdstuk 4

Ontwikkelen van een Media

Fragments URI-parser

4.1 Algemeen

Nog voor het implementeren van de Android-app en parser, werd al beslist dat de parser volledig

apart ontwikkeld zou worden. De parser werd dus opgevat als een bibliotheek. Eens klaar, kon

die gebruikt worden in de Android-app. Dit had meerdere redenen:

� Het ontwikkelen van een Java-bibliotheek laat toe dat de code getest kan worden zonder

nood aan een Android-apparaat, wat een trage schakel uit het ontwikkelproces haalt.

� Er kan parallel gewerkt worden aan de parser en aan de Android-app. Als een nieuwe

versie van de parser klaar is, hoeven we maar een bestand te vervangen om van de nieuwe

parserbibliotheek gebruik te kunnen maken.

� Als bibliotheek is de parser ook beschikbaar in andere projecten.

In de volgende sectie wordt de architectuur in grote lijnen besproken.

4.2 Architectuur

De parser is geschreven op een manier dat ze gemakkelijk uit te breiden is, voor latere toevoeg-

ingen aan de Media Fragments-specificatie. Daarom is een aantal keren abstractie gebruikt. In

Page 40: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

4.2 Architectuur 28

AbstractValueParser AbstractValue Suffix-en

TemporalValueParser TemporalValue NPTSuffix

SMPTESuffix

ClockSuffix

SpatialValueParser SpatialValue SquareSuffix

TrackValueParser TrackValue Trackuffix

IDValueParser IDValue IDSuffix

Tabel 4.2: AbstractValueParser-, AbstractValue- en Suffix-implementaties

figuur 4.1 wordt de hoofdstructuur van de parser getoond. Merk op dat voor de overzichtelijkheid

in deze en volgende figuren alleen structuren opgenomen zijn, geassocieerd met de temporele en

spatiale as uit de Media Fragments-specificatie.

Het uitbreiden van de parser voor een nieuwe as gebeurt door implementaties te schrijven voor

drie klassen:

� AbstractValueParser is de abstracte voorstelling van een waardeparser. Bij elke sleutel

(t, xywh, ...) hoort een unieke waardeparser.

� AbstractValue is de abstractie van een geparsete waarde uit een sleutel-waardepaar.

� Suffix is de abstractie van een geparsete parameter uit een waarde.

Alle klassen die AbstractValueParser, AbstractValue en Suffix implementeren, worden voor

de volledigheid gegeven in tabel 4.2.

MFUriParser is de klasse waar ’gestart’ wordt. Er kan een URI of fragment ingegeven worden.

Na het parsen kunnen alle geldige en ongeldige sleutel-waardeparen opgevraagd worden. Zo’n

paar wordt voorgesteld door de klasse Pair. De methodesignaturen in deze klasse spreken

voor zich, enkel getValueObj() hoeft misschien een woordje uitleg. Pair maakt gebruik van

een AbstractValueParser-instantie die de waarde uit het sleutel-waardepaar parset, en een

AbstractValue aanmaakt met daarin alle informatie over die waarde. Pair kiest de juiste

Page 41: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

4.2 Architectuur 29

instantie van een AbstractValueParser op basis van de sleutel uit het sleutel-waardepaar. Dit

wordt verduidelijkt in voorbeeld 13 en op figuur 4.2 is dit getoond.

Voorbeeld 13 (Parsen van sleutel-waardepaar)

Stel dat het te parsen sleutel-waardepaar gegeven is door t=10,20. Op basis van

de sleutel t beslist de klasse Pair dat een TemporalValueParser geschikt is om de

waarde te parsen. Deze waardeparser maakt een TemporalValue-object aan met alle

geparsete data.

Een AbstractValue bestaat altijd uit een Unit en een of meerdere Suffix-objecten.

Voorbeeld 14 (Parsen van eenheid en suffixen)

Een TemporalValueParser beslist op basis van de waarde 10,20 uit het sleutel-

waardepaar t=10,20 dat de eenheid ’npt’ is, daar er geen expliciet eenheid aanwezig

is. Bij dit eenheid horen 2 suffixen: de begin- en eindtijd van het temporeel fragment.

De suffixen zullen dan instanties zijn van NPTSuffix.

Page 42: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

4.2 Architectuur 30

MFUriParser

+ getPair(int) : Pair

+ getPairCount() : int

+ getValidPair(int) : Pair

+ getValidPairCount() : int

+ getValidPairs() : List<Pair>

+ parseFragment(String) : void

+ parseUri(String) : URI

+ printValidPairList() : String

Pair

+ SPATIAL : int

+ TEMPORAL : int

+ getName() : String

+ getType() : int

+ getTypeName() : String

+ getValue() : String

+ getValueObj(): AbstractValue

+ isValid() : boolean

+ parse() : void

AbstractValueParser

+ getValue() : String

+ getValueObj() : AbstractValue

+ isValid() : boolean

+ parse() : void

+ setValue(String value) : void

# getParserName : String

# getParserType : int

AbstractValue

+ getUnit() : Unit

+ print() : String

# getSuffix(int nr) : Suffix

# getSuffixCnt() : int

Suffix

+ print() : String

Figuur 4.1: Hoofdstructuur van de Media Fragments-parser

Page 43: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

4.2 Architectuur 31

Abs

tract

Valu

ePars

er

+ge

tVal

ue(

):

Str

ing

+ge

tVal

ueO

bj(

):

Ab

stra

ctV

alu

e

+is

Val

id()

:b

ool

ean

+p

arse

():

void

+se

tVal

ue(

Str

ing

valu

e):

voi

d

#ge

tPar

serN

ame

:S

trin

g

#ge

tPar

serT

yp

e:

int

Sp

ati

alV

alu

eP

ars

er

Tem

pora

lValu

eP

ars

er

Abs

tract

Valu

e

+get

Un

it()

:U

nit

+p

rint(

):

Str

ing

#get

Su

ffix(i

nt

nr)

:S

uffi

x

#get

Su

ffixC

nt(

):

int

Sp

ati

alV

alu

e

-are

a:

Sp

ati

alS

uffi

x

Tem

pora

lValu

e

-ar

ea:

Su

ffix

+T

emp

oralV

alu

e(N

PT

Su

ffix,

NP

TS

uffi

x)

+T

emp

oralV

alu

e(S

MP

TE

Su

ffix,

SM

PT

ES

uffi

x)

Un

it

+S

PA

TIA

LP

ER

CE

NT

AG

E:

int

+S

PA

TIA

LP

IXE

L:

int

+T

EM

PO

RA

LN

PT

:in

t

+get

Typ

e()

:in

t

+p

rint(

):

Str

ing

Su

ffix

+p

rint(

):

Str

ing

Squ

are

Su

ffix

+get

H()

:in

t

+get

W()

:in

t

+get

X()

:in

t

+get

Y()

:in

t

NP

TS

uffi

x

+get

Hh

():

int

+get

Mm

():

int

+get

Ms(

):

int

+get

Ss(

):

int

Fig

uu

r4.2

:A

rch

itec

tuu

rva

nd

eM

edia

Fra

gmen

ts-p

arse

r

Page 44: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

4.3 Parse-algoritme 32

4.3 Parse-algoritme

De parser krijgt als input een URI of URI-fragment en voert dan de volgende stappen uit:

1. Indien een URI werd opgegeven, wordt het URI-fragment hieruit geextraheerd op basis

van het eerste voorkomen van het #-teken.

2. ’Percent-encodings’ in het fragment worden omgezet in echte karakters. Bvb. ’%74’ staat

voor ’t’.

3. Het URI-fragment wordt gesplitst in paren (Pair-klasse), welke worden gescheiden met

het &-teken.

4. Voor elk paar wordt de sleutel en waarde geextraheerd op basis van het eerste voorkomen

van het =-teken. De sleutel wordt vergeleken met bekende sleutels: indien de sleutel

onbekend is, wordt dit paar ongeldig gemarkeerd en stopt het parsen voor dit paar.

5. Voor elk paar met een geldige sleutel, wordt op basis hiervan een klasse gebruikt (bvb.

TemporalValueParser) die specifiek voor deze sleutel, de waarde van het paar kan parsen.

6. Indien de waarde een ’:’-teken bevat, zal de tekst voor dit teken als eenheid worden

beschouwd en de tekst na dit teken als het suffixgedeelte. Herkent de waardeparser de een-

heid voor de sleutel niet, dan neemt de waardeparser de standaardeenheid en beschouwt

de totale waarde als het suffixgedeelte. Indien het suffixgedeelte niet geldig blijkt, wordt

dit paar als ongeldig gemarkeerd.

Page 45: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

4.4 Unit tests en logging 33

Voorbeeld 15 (Parse-algoritme stappen)

De parser krijgt volgende input:

http : // example . com/movie . mp4#%74=0:20,0:40&xywh=10 ,10 ,80 ,

Hieruit wordt de URI geextraheerd en percent-encodings worden omgezet:

t=0:20 ,0:40& xywh=10 ,10 ,80

Er worden 2 paren herkend. Voor het temporele paar wordt de t-sleutel herkend

en zal de waarde worden geparsed met TemporalValueParser. Deze ziet 0: als de

eenheid maar herkent deze niet. De temporele standaardeenheid npt wordt genomen

en 0:20,0:40 als suffixgedeelte. Dit blijkt uiteindelijk een correct paar te zijn.

SpatialValueParser zal het spatiaal paar ongeldig markeren, omdat de waarde

incorrect is.

4.4 Unit tests en logging

Voor het testen van de parser werden 132 unit tests gedefinieerd. Alle voorbeelden uit de

specificatie zijn hierin vervat, zodat met zekerheid gezegd kan worden dat de parser volledig

werkt. Ook ’percent encodings’ worden correct verwerkt.

Voor het loggen van output van de parser wordt de interface MFLoggerHandle geımplementeerd.

Tijdens het ontwikkelproces werd op deze manier het logging-framework Log4J20 aangeschakeld.

Er werd voor deze methode gekozen omdat Log4J niet werkt op Android apparaten, en er

gemakkelijk moet kunnen verwisseld worden tussen verschillende loggingmethodes. Figuur 4.3

verduidelijkt dit principe.

4.5 Broncode

De DVD bij dit document bevat de broncode van de Media Fragments parser, onder de vorm

van een Netbeans-project. U vindt de projectstructuur onder de map ’parser’.

20http://logging.apache.org/log4j/

Page 46: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

4.5 Broncode 34

MFLogger

+ getMFLogger() : MFLogger

+ getMFLoggerHandle() : MFLoggerHandle

+ setMFLoggerHandle(MFLoggerHandle) : void

<<interface>>

MFLoggerHandle

# err(String)

# getName(): String

# info(String)

# warn(String)

MFLog4JLogger MFDummyLogger

Figuur 4.3: Deze architectuur laat toe om Log4J af te schakelen als de parser-

bibliotheek op Android-apparaten werd gebruikt.

Page 47: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

ONTWIKKELEN VAN EEN COMPATIBELE MEDIASPELER 35

Hoofdstuk 5

Ontwikkelen van een compatibele

mediaspeler

5.1 Requirements en features

Vooraf dient er beslist te worden wat de vereisten zijn voor de app, en welke functionaliteit deze

moet bieden.

� Eerst en vooral: de app zal draaien op een mobiel apparaat, een smartphone, en dus moet

de gebruiker dit ook voelen. De video draait mee met de orientering van het scherm,

schaalt mee, en de besturing moet gebeuren met aanrakingen op het scherm.

� De temporele as wordt enkel geımplementeerd voor de standaardeenheid npt: de andere

eenheden bieden weinig meerwaarde op een mobiel apparaat. Zo vereist smpte kennis over

het exact aantal frames per seconde in een video en clock heeft enkel nut bij livestreams.

� De spatiale as wordt volledig ondersteund.

� De track- en id-as worden niet geımplementeerd, omwille dat het technisch onmogelijk is

om met de Android SDK tracks te extraheren. Ook het opvragen van begin- en eindtijden

van gedefinieerde hoofdstukken, zoals bij een DVD, is niet mogelijk.

� De app moet, naast zelfstandig te kunnen starten uit het app-menu, ook gestart kunnen

worden en fragmentatie toepassen als de gebruiker op een link naar een media-object klikt

in een browser.

Page 48: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

5.2 Algemene app-levenscyclus 36

5.2 Algemene app-levenscyclus

Een Android-app bestaat algemeen uit meerdere Activity’s. Een Activity is het geheel van een

UI (hetgeen wat dus op een gegeven moment op het scherm getoond wordt) met achterliggende

code. Een app kan dan overgaan van de ene naar de andere Activity. Bijvoorbeeld: uit een

lijst van contactpersonen moet iemand gekozen moet worden. Wanneer de gebruiker klikt op

’kiezen’ dan wordt overgegaan van de huidige naar een andere Activity: deze bestaat uit een

lijst van contactpersonen (de UI), en de code die er ondermeer voor zorgt dat naar de oproepende

Activity wordt teruggekeerd met een referentie naar de geselecteerde contactpersoon. In figuur

5.1 wordt dit getoond.

Figuur 5.1: De linkse Activity start de rechtse door te ’klikken’ op ’Contacts’.

Gemakkelijk gezegd, staat elk ’volledig scherm’ voor een andere Activity. Eender welke app

kan een Activity van een andere app oproepen, als deze laatste app dat ’toestaat’ in een

beschrijvend metabestand (AndroidManifest.xml). Zo is het mogelijk om een browser-app te

laten starten, als de oproepende app voorziet in een HTTP-URI (http://...). Het Android-

besturingssysteem filtert de lijst van mogelijke applicaties.

De Media Fragments-app zal uiteraard op z’n minst een videospeler-Activity bevatten: het

scherm waarin de video wordt afgespeeld. We kunnen dan in het metabestand aangeven dat

deze Activity mag gestart worden uit een browser met de volgende lijnen:

Page 49: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

5.3 Implementatie 37

Voorbeeld 16 (Activity-filtering)

<a c t i v i t y

android:name=” . VideoPlayer ”

<in tent− f i l t e r>

<ac t i on android:name=”android . i n t en t . a c t i on .VIEW” />

<data android :scheme=”http ” android:mimeType=” video /*” />

<category android:name=”android . i n t en t . category .BROWSABLE” />

</ intent− f i l t e r>

</ a c t i v i t y>

Bij het klikken op een link in een browser, wordt aan het Android-systeem een

zogenaamd Intent-object gegeven met daarin de beschrijving van de actie. De

Media Fragments-app geeft hier aan dat het enkel wil reageren op de actie ’VIEW’

met categorie ’BROWSABLE’. Bovendien moet de link refereren naar een object met

MIME-type video/*: de Media Fragments-app zal dus niet worden aangeboden in

een lijst van mogelijke apps, als er bijvoorbeeld wordt geklikt op een link naar een

webpagina.

Merk op dat in Android-versies voor 3.0 (Honeycomb) er een bug bestaat waarbij bij het klikken

op een link in een browser, de ’fragment identifier’ uit de URI verdwijnt. De Media Fragments-

app ontvangt dus wel de URI naar de ’primary resource’ maar geen fragmentinformatie. Deze

bug werd gerapporteerd21. Concreet wil dit zeggen dat de app wel werkt in Android-versies voor

Honeycomb, maar indien gestart vanuit een browser, zal geen fragmentering worden toegepast:

de video speelt in zijn geheel af. De URI zal in deze gevallen moeten gekopieerd worden, en

ingegeven worden in de Media Fragments-app zelf.

5.3 Implementatie

De app bestaat uit 3 Activity’s. Een waar een (Media Fragments) URI kan ingegeven wor-

den, een waar de geparsete sleutel-waardeparen worden opgelijst en een waar de video wordt

afgespeeld. In figuur 5.2 worden de eerste twee getoond.

Het belangrijkste is natuurlijk de derde Activity, de videospeler zelf. Deze wordt gestart als

in een browser op een videolink wordt geklikt. In figuur 5.3 wordt de speler getoond.

De video wordt steeds zo groot mogelijk weergegeven terwijl de verhouding van videobreedte en

21http://code.google.com/p/android/issues/detail?id=25100

Page 50: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

5.3 Implementatie 38

Figuur 5.2: De linkse Activity is het startscherm van de Media Fragments-app,

waarin de URI kan worden ingegeven. De tweede controleert de URI en lijst de

geldige en ongeldige sleutel-waardeparen op.

Figuur 5.3: De videospeler in portretmodus

-hoogte gerespecteerd wordt. De video wordt ook centraal gezet. Als het apparaat van orientatie

verandert, worden de afmetingen en marges herberekend.

In figuur 5.2 zien we meteen de toepasing van het sleutel-waardepaar xywh=percent:0,0,50,50

dat werd ingegeven in de eerste Activity. Inderdaad: de rechthoek begint op 0% van de breedte

en hoogte, en eindigt op 50% van de totale breedte en hoogte van de video-afmetingen.

Het spatiaal fragment werd geımplementeerd met een semitransparante ’overlay’ waarin een

rechthoek kan worden uitgespaard. De app houdt de 4 parameters van de spatiale as bij zoals

ze zijn opgegeven in de URI: er wordt geen omzetting gedaan van percent- naar pixelnotatie of

omgekeerd. Pas bij het starten van de video of na herorientering van het apparaat, worden de

werkelijke coordinaten op het scherm berekend, om afrondingsfouten tegen te gaan.

Page 51: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

5.3 Implementatie 39

Figuur 5.4: Inzoomen op een spatiaal fragment

Er kan worden ingezoomed op een spatiaal fragment door een lange aanraking op de rechthoek.

Dat fragment wordt dan full-screen weergegeven zoals in figuur 5.4. Op deze afbeelding ziet

u overigens ook de voortgangsbalk waarop het temporeel fragment met geel staat aangeduid.

Verder zijn ook knoppen beschikbaar om het afspelen te pauzeren, om het temporeel fragment

opnieuw te bekijken, enz. De voortgangsbalk en knoppen kunnen weggelaten of teruggebracht

worden met een korte aanraking op het scherm.

Dat de videospeler ook werkt in horizontale orientatie van het apparaat, ziet u in figuur 5.5.

Als de speler het einde van het temporeel fragment bereikt, pauzeert de speler, tenzij de gebruiker

vooraf had doorgespoeld naar een tijdstip buiten het temporeel fragment.

Figuur 5.5: De videospeler in landschapsmodus, normaal en ingezoomed op een

spatiaal fragment.

Page 52: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

5.4 Broncode 40

5.4 Broncode

De DVD bij dit document bevat de broncode van de “Media Fragments player”, onder de vorm

van een Eclipse-project. U vindt de projectstructuur onder de map ’player’.

Page 53: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

UITBREIDING VAN DE MEDIA FRAGMENTS-SPECIFICATIE 41

Hoofdstuk 6

Uitbreiding van de Media

Fragments-specificatie

6.1 Spatiaal-temporele fragmentatie

6.1.1 Motivatie

De huidige Media Fragments-specificatie omvat zowel temporele als spatiale fragmentatie. Bij

dit laatste behoudt het spatiaal ’focusgebied’ zijn statische positie gedurende de gehele lengte

van de video, wat in enkele situaties ongewenst kan zijn:

� Het object waarop de focus gelegd wordt, kan bewegen, zodat dit object op bepaalde

tijdstippen slechts gedeeltelijk zichtbaar is of zelfs helemaal uit het focusgebied verdwijnt.

� Het object waarop de focus gelegd wordt, kan vergroten of verkleinen, zodat een aanpassing

van de grootte van het focusgebied gewenst is. Het initieel groot genoeg maken van het

focusgebied zodat het object steeds binnen de grenzen zou vallen, is geen goede oplossing:

bij een klein object en groot focusgebied is er van ’focus’ nauwelijks sprake.

Het introduceren van een spatiaal-temporele as in de Media Fragments-specificatie is dus gerecht-

vaardigd. Vanaf nu noemen we een spatiaal-temporeel fragment een ’traject’.

In de volgende sectie wordt besproken hoe deze nieuwe fragmentatiewijze ontworpen werd met

het oog op eenvoud en uniformiteit met de bestaande specificatie.

Page 54: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

6.1 Spatiaal-temporele fragmentatie 42

6.1.2 Invoering van het traj-sleutel-waardepaar

6.1.2.1 Vereisten

Het invoeren van een nieuwe as stelt een aantal eisen. Voor een traject zijn dit volgende zaken:

� Er mag geen interferentie met andere assen optreden. Wanneer zowel spatiale fragmen-

tatie als een spatiaal-temporeel traject wordt opgegeven, moet op elk tijdstip in de video

eenduidig te achterhalen zijn waar het spatiaal gebied zich bevindt.

� Voor uniformiteit met de huidige specificatie, maar eveneens voor de eenvoud, wordt een

traject beschreven a.d.h.v. koppels van spatiale gebieden en tijdstippen. De notaties voor

spatiale gebieden gebeuren zoals in de xywh-sleutel-waardeparen en de tijdstippen zoals

in de t-sleutel-waardeparen (enkel npt-notatie). Het opgeven van de coordinaten van de

rechthoeken kan dus ook gebeuren in pixel- of percentwaarden.

� De beschrijving van een bepaald traject moet uniek zijn.

� Voor uniformiteit met de huidige specificatie, mag maar een traject worden opgegeven. Er

mag dus maar een sleutel-waardepaar voor deze nieuwe as voorkomen in het URI-fragment.

De combinatie van twee trajecten die elkaar in de tijd niet zouden overlappen, moet dus

te beschrijven zijn in een traject. Merk op dat dit de uniciteit van vorig puntje in de hand

werkt.

6.1.2.2 Ontwerp

Het algemeen idee achter een traject is dat er verschillende spatiale gebieden in de tijd worden

gespecificeerd, en dat met vlaggen wordt aangeduid hoe er van het ene spatiaal gebied naar het

andere wordt overgegaan in de tijd. Figuur 6.1 verduidelijkt dit idee.

In figuur 6.1 zijn er 3 spatiale gebieden opgegeven. Het eerste gebied (groen) komt steeds overeen

met de starttijd van het temporeel fragment en het laatste gebied (rood) met de eindtijd van

het temporeel fragment. Deze twee gebieden (en enkel deze twee) zijn dus steeds impliciet

geassocieerd met een tijdstip. Bij alle tussenliggende gebieden (blauw) moet wel een tijdstip

worden opgegeven. Als de speler zich bevindt op seconde 44, dan wordt exact dat spatiaal gebied

getoond dat overeenkomt met de waarde in het blauw vierkant. Hoe het spatiaal gebied zich

gedraagt tussen de opgegeven gebieden in, hangt af van de vlag:

Page 55: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

6.1 Spatiaal-temporele fragmentatie 43

x,y,w,h x,y,w,hkeep

x,y,w,hinterpolate

temporeel fragment

t0s 20s 40s 60s 80s

Figuur 6.1: Schematische voorstelling van een traject in een video van 87 seconden.

Het fragment start op 7 seconden en eindigt op 70 seconden.

x,y,w,h x,y,w,hinterpolate keep

temporeel fragment

t0s 20s 40s 60s 80s

Figuur 6.2: De ’keep’-vlag als laatste vlag

� interpolate (i): laat de rechthoek geleidelijk overgaan van het opgegeven gebied naar het

volgend opgegeven gebied. Het interpoleren gebeurt lineair volgens de tijd. Deze vlag mag

enkel gebruikt worden tussen twee opgegeven rechthoeken.

� keep (k): behoud de afmetingen van het gebied tot het volgend opgegeven gebied of tot

het einde van het fragment. Deze vlag komt overeen met spatiale fragmentatie, gezien de

rechthoek statisch blijft staan.

Indien de laatste vlag in het traject de ’keep’-vlag is, dan moet de rechthoek, die overeenkomt

met het einde van het spatiaal fragment, niet opgegeven worden aangezien de coordinaten hier-

van nutteloos zijn (er wordt niet naar geınterpoleerd). In dit geval komt de laatst opgegeven

rechthoek niet overeen met het einde van het fragment, en moet er dus wel een tijdstip worden

opgegeven. Een voorbeeld hiervan ziet u in figuur 6.2.

We kunnen een traject beschouwen als een uitbreiding van spatiale fragmentatie: de rechthoek

Page 56: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

6.1 Spatiaal-temporele fragmentatie 44

hoeft zich niet langer statisch te gedragen. Omgekeerd is een spatiaal fragment een traject

zonder tussengebieden en interpolatie. Een traject is dus ’backwards compatible’ met spatiale

fragmentatie.

Anderzijds blijft temporele fragmentatie ongewijzigd met de nieuwe as: de tijdsaanduidingen in

de spatiaal-temporele as hebben geen invloed op de begin- en eindtijd van het fragment.

We zouden de spatiale as dus eerder kunnen uitbreiden en de invoering van een volledig nieuwe

as overbodig maken. Echter:

� Een speler die de notatie voor spatiaal-temporele fragmentatie niet zou verstaan omdat hij

de notatie voor de xywh-sleutel verwacht, verliest dan alle opgegeven spatiale fragmentatie.

� Een speler die de nieuwe as niet herkent, negeert deze volledig en zal dus kunnen terugvallen

op spatiale fragmentatie d.m.v. de xywh-sleutel (indien opgegeven).

6.1.2.3 Notatie in het URI-fragment

Het Engels woord voor ’traject’ is ’trajectory’. We noemen de nieuwe vlag traj.

We laten twee eenheden toe om coordinaten van de rechthoeken te noteren in pixel- of percent-

waarden, wat uniform is met xywh: pixel en percent.

De waarde van het sleutel-waardepaar is een iteratie van rechthoekcoordinaten met dezelfde no-

tatie als in xywh, een tijdspunt in npt-notatie (geen tijdspunt voor de eerste, en indien opgegeven,

de laatste rechthoek) en een vlag i of k. Deze 3 componenten (coordinaten, tijd, vlag) worden

telkens door een puntkomma.

Voor de exacte formaatspecificatie voor de spatiaal-temporele as wordt u verwezen naar bijlage E.

De formaatspecificatie wordt toegepast in voorbeeld 17.

Voorbeeld 17 (Media Fragments traj-sleutel-waardepaar)

http : // example . com/movie . mp4#t=10,25&traj=percent : 2 5 , 2 5 , 5 0 , 5 0 ; k←↩

; 2 5 , 2 5 , 5 0 , 5 0 ; 1 5 ; i ; 35 , 25 ,60 ,60

De video speelt van seconde 10 tot 25. Van seconde 10 tot 15 blijft de rechthoek

statisch (k). Vanaf seconde 15 wordt geınterpoleerd tot seconde 25 (einde van het

temporeel fragment). Hierbij zal de rechthoek licht naar rechts bewegen (35 - 25 =

10%) en ook iets groter worden.

Page 57: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

6.1 Spatiaal-temporele fragmentatie 45

TrajectoryValueParser

TrajectoryValue

+ getSuffixCnt() : int

+ getSuffix(int) : Suffix

TrajectorySuffix

+ FLAG INTERPOLATE : char

+ FLAG KEEP : char

TrajectoryFlagSuffix

+ getFlag() : char

TrajectorySquareTempSuffix

+ getTime() : NPTSuffix

+ getSquare() : SquareSuffix

Figuur 6.3: Het uitbreiden van de Media Fragments-parser naar ondersteuning

voor spatiaal-temporele fragmentatie.

6.1.3 Implementatie in de parser

Het uitbreiden van de parser is snel gebeurd door het bijschrijven van enkele klassen (zie hoofd-

stuk 4, sectie 4.2). Gezien de overeenkomsten qua notaties van de waarden horend bij de

xywh- en t-sleutels, kunnen we bestaande parsercode hergebruiken. Zo wordt de tijd geparsed

door TemporalValueParser en de rechthoekcoordinaten door SpatialValueParser. Voor de

volledigheid worden de bijkomende klassen in figuur 6.3 getoond (zonder abstractieklassen).

6.1.4 Implementatie in de videospeler

De implementatie in de videospeler zet de geparsete parameters uit de URI om naar een 2-

dimensionale array van getallen, voor het afspelen begint. Op deze manier worden al heel wat

berekeningen op voorhand gedaan en moeten deze niet telkens herhaald worden, bijvoorbeeld bij

het doorspoelen van de video. Een entry van deze array bevat informatie over hoe het spatiaal

gebied zich moet gedragen gedurende een bepaald tijdsgebied in de video. Deze tijdsgebieden

zijn telkens gedefinieerd door twee aansluitende tijdspunten. Deze tijdspunten zijn de begintijd

van de video, de begintijd van het temporeel fragment, de opgegeven tijdstippen in de waarde

Page 58: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

6.2 Andere uitbreidingsmogelijkheden 46

temporeel fragment

t0s 20s 40s 60s 80s

Figuur 6.4: Omzetting naar arraywaarden

van het traj-sleutel-waardepaar, en de eindtijd van het temporeel fragment en van de video.

In figuur 6.4 wordt dit gevisualiseerd: een grijs vierkantje staat voor een entry in de array. In de

figuur zijn dit er 7: twee voor begin- en eindtijd van de video, nog twee voor begin- en eindtijd

van het fragment en drie voor de rechthoeken opgegeven in het traj-sleutel-waardepaar.

Elke entry bevat 8 getallen. [t1 t2 e i x y w h

]Hierin staan t1 en t2 respectievelijk voor begin- en eindtijd van het tijdsgebied waarvoor deze

array array wordt gedefinieerd. e duidt aan of er spatiale fragmentatie moet worden toegepast,

i geeft aan of er geınterpoleerd moet worden naar de volgende rechthoek en de vier resterende

getallen zijn de dimensies van de huidige rechthoek. Merk op dat in de laatste entry van de

array, enkel de dimensiegetallen van nut zijn (om in het laatste gebied te kunnen interpoleren).

Tijdens het afspelen van de video wordt dan op basis van de huidige afspeelpositie bepaald

welke entry van de array geldig is. Eens gevonden, kan meteen de correcte spatiale fragmentatie

worden toegepast.

Na deze uitbreiding ondersteunt de Media Fragments-speler spatiaal-temporele fragmentatie.

Vier screenshots van de app worden weergegeven in figuur 6.5 voor het URI-fragment

t=10,25&traj=percent : 1 0 , 1 0 , 1 0 , 8 0 ; i ; 2 5 , 2 5 , 5 0 , 5 0 ; 1 5 ; k ; 5 0 , 5 0 , 4 0 , 1 0 ; 2 0 ; k

6.2 Andere uitbreidingsmogelijkheden

Er kan ook aan andere uitbreidingen worden gedacht, bijvoorbeeld:

� Meerdere spatiale gebieden tegelijkertijd tonen

Page 59: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

6.2 Andere uitbreidingsmogelijkheden 47

Figuur 6.5: Enkele screenshots van de app op seconden 10, 13, 14 en 20 voor

een bepaald URI-fragment (zie tekst). Merk op dat op seconde 13 interpolatie

plaatsvindt tussen de rechthoeken op seconde 10 en 15. Vanaf seconde 20 is de

rechthoek statisch.

� Meerdere spatiaal-temporele gebieden tegelijkertijd tonen

� Andere vormen dan rechthoeken mogelijk maken

Er moet evenwel op gelet worden dat de specificatie niet overladen wordt met nutteloze eigen-

schappen die zelden gebruikt zullen worden. Alsook, hoe groter de specificatie, hoe complexer

de URI. Dit wensen we te vermijden.

Page 60: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

CONCLUSIES 48

Hoofdstuk 7

Conclusies

In deze masterproef werd onderzocht hoe de Media Fragments-specificatie kon geımplementeerd

worden op een mobiel apparaat, en hiervoor werd het Android-platform geselecteerd. Een Media

Fragments videospeler werd gebouwd die gebruik maakt van een Media Fragments URI-parser

en er werd nagegaan hoe de datatrafiek positief kon worden beınvloed door kennis van een

temporeel fragment gespecificeerd in een Media Fragments URI. De resultaten hiervan hebben

niet geleid tot een implementatie die controle over de datatrafiek kan uitoefenen.

De Media Fragments-specificatie werd uitgebreid naar ondersteuning voor spatiaal-temporele

fragmentatie en dit werd ook geımplementeerd in de Android app.

Page 61: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

49

Bijlagen

Page 62: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

SOFTWARE DEVELOPMENT KIT (SDK) 50

Bijlage A

Software Development Kit (SDK)

Het eerste wat moet gebeuren is het opzetten van de programmeeromgeving. Dit houdt in dat

de SDK wordt gedownload en geınstalleerd, en deze ondersteund wordt door de ontwikkelings-

omgeving (IDE, Integrated Development Environment). Met het oog hierop werden reeds enkele

plugins voor meerdere IDE’s ontwikkeld: ’nbandroid’ voor Netbeans, ’ADT plugin’ voor Eclipse.

Voor deze masterproef werd met Eclipse gewerkt.

De SDK komt er in verschillende versies: voor elke update (uitgezonderd bugfixes) aan het

Android-besturingssysteem (OS, Operating System) wordt een nieuwe SDK uitgebracht. Elke

versie van het OS krijgt een naam, die trouwens gebaseerd is op namen van veelal zoete

etenswaren, waarbij de SDK een overeenkomstig nummer krijgt.

Versie SDK-nummer(s) Naam

1.5 3 Cupcake

2.2.x 8 Froyo

2.3.x 10 Gingerbread

3.x 11-13 Honeycomb

4.x 14-15 Ice Cream Sandwich

Tabel A.2: Een greep uit de verschillende Android-versies

De SDK voorziet een emulator om applicaties in ontwikkeling te testen, indien geen fysiek

Page 63: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

SOFTWARE DEVELOPMENT KIT (SDK) 51

apparaat voorhanden. Deze reageert echter steeds met een grote vertraging op invoer waardoor

beslist werd om te programmeren op een echt apparaat. Dit werd de Samsung Galaxy Ace welke

draait op Android v2.3 (Gingerbread). De minimumversie van de SDK is dus 10: de applicatie

zal niet kunnen geınstalleerd worden op apparaten met Android v2.2 (Froyo) of lager. Er kon

ook getest worden op andere devices aangekocht door Multimedialab: een HTC Wildfire S, een

Samsung Galaxy Tab en een Galaxy Nexus.

Figuur A.1: De Android emulator met SDK 10, onder Ubuntu 11.10.

Om een applicatie te schrijven met de Android SDK werden verschillende tutorials gevolgd en

heel wat documentatie gelezen op de Android Developer website22. Zo kon een basis worden

gelegd om van te vertrekken.

22http://developer.android.com/

Page 64: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

NATIVE DEVELOPMENT KIT (NDK) 52

Bijlage B

Native Development Kit (NDK)

Zoals beschreven in subsectie 3.2, kan er geen controle over de datatrafiek worden uitgeoefend

tijdens het afspelen van een video via de standaard ingebouwde media-architectuur van Android.

Een oplossing hiervoor is het implementeren van een eigen videospeler, maar dit vereist dat er

geprogrammeerd wordt in native code, geschreven in C. Een eigen videospeler programmeren zou

wel heel wat extra werk kunnen opleveren en ligt eigenlijk buiten de opzet van deze masterproef;

toch kan het geen kwaad om te kijken hoeveel werk er effectief in zou kruipen om alsnog een

beslissing te maken over het wel of niet implementeren.

Het decoderen van video’s zouden we namelijk niet zelf moeten programmeren: FFmpeg is

een gratis library geschreven in C voor het encoderen en decoderen van video en audio en het

ondersteunt zowat alle gangbare containers en codecs (zie ook bijlage D).

De Native Development Kit (NDK) stelt ons in staat om te programmeren in C en C++. Deze

voorziet allerlei tools, waaronder compilers, om native code werkend te krijgen op een Android

device. Veelal bevatten Android-apparaten processoren voor de ARM-instructieset. De NDK

compileert dan naar ARM-code.

Net zoals de SDK, kan er na een paar tutorials en het lezen van enkele documenten aan de

slag worden gegaan. De native broncode moet eerst apart gecompileerd worden en komt dan

allemaal terecht in een bibliotheek die via JNI (Java Native Interface, zie ook bijlage C) kan

aangesproken worden vanuit Java-code.

De NDK compileert native code met de tool ndk-build.

Het ganse proces om C-code werkend te krijgen op een Android-apparaat bestaat in principe

uit twee grote stappen:

Page 65: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

NATIVE DEVELOPMENT KIT (NDK) 53

� Schrijf de C-code (.c) en de bijhorende headers (.h). Voorzie een bestand Android.mk

waarin omschreven staat hoe de code moet gecompileerd worden - bijvoorbeeld enkel voor

de armeabi-instructieset en niet voor armv7 - en refereer van hieruit naar andere benodigde

bibliotheken. Deze bestanden moeten alle drie in de map jni/ onder de projectstructuur

van een Android-app. De methodes in de C-code die vanuit Java dienen aangesproken

te worden, moeten voldoen aan een specifieke signatuur met bepaalde sleutelwoorden (zie

bijlage C).

� Compileer m.b.v. de bij NDK bijgeleverde tool ndk-build. Als output wordt een of

meerdere .so-bestanden verkregen: een voor elke bibliotheek en een voor de zelfgeschreven

code die op deze bibliotheken steunt. .so is de extensie voor bibliotheken onder Linux,

Android is Linux-gebaseerd. De gegenereerde bestanden worden automatisch in de map

libs/armeabi/ onder de projectstructuur geplaatst, indien gecompileerd werd voor arme-

abi.

Na deze twee stappen kan de C-code worden aangesproken vanuit de Java-code van de eigenlijke

app.

Page 66: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

JAVA NATIVE INTERFACE (JNI) 54

Bijlage C

Java Native Interface (JNI)

Java Native Interface (JNI) is een deel van de Java Application Programming Interface (API)

en is de interface waarbij vanuit Java-code andere, gecompileerde niet-Java-code kan worden

aangesproken. Deze code wordt ’native code’ genoemd en wordt veelal gebundeld in bibliotheken

(.so-bestanden).

Stel dat de bibliotheken na het compileerproces aanwezig zijn onder de map libs/ in de pro-

jectstructuur van de Android-app. Dan zijn er nog enkele stappen nodig om de native code aan

te spreken. In voorbeeld 18 worden deze toegelicht.

Page 67: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

JAVA NATIVE INTERFACE (JNI) 55

Voorbeeld 18 (Aanspreken native code via JNI)

Indien de bibliotheek libtest.so heet (het prefix lib en suffix .so worden au-

tomatisch aan de naam “test” geplakt tijdens het compileerproces), schrijf dan in de

Java-klasse thiz.is.a.Clazz volgend stuk code:

s t a t i c {

System . loadLibrary ( ” t e s t ” ) ;

}

In diezelfde klasse, definieer volgende methode:

pub l i c nat ive String getMessage ( ) ;

Het native-sleutelwoord duidt aan dat er in de code binnen libtest.so een C-

methode bestaat met volgende signatuur:

JNIEXPORT jstring JNICALL Java_thiz_is_a_Clazz_getMessage

( JNIEnv* env , jobject o )

waarbij jstring equivalent is met String uit Java, en de naam van de methode

duidelijk overeenstemt met de naam en package van de klasse en naam van de

methode getMessage().

Bij het aanroepen van de methode getMessage() in Java, zal de native methode

worden aangesproken en resultaat teruggeven.

JNI en de NDK maken het nu samen mogelijk om stukken van de applicatie te schrijven in

native code en deze op te roepen vanuit de Java-code van de applicatie, die overigens in de

Dalvik Virtual Machine (Dalvik VM) draait.

Page 68: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

FFMPEG 56

Bijlage D

FFmpeg

Binnen FFmpeg-code worden de databytes van een video opgedeeld in struct AVPacket’s. Alle

pakketten kunnen benaderd worden door gebruik te maken van een AVPacketList, een gelinkte

lijst met aan de kop een AVPacket en als staart weer een AVPacketList. Om te berekenen

hoeveel databytes overgeslaan moeten worden, is het noodzakelijk om door deze gelinkte lijst te

lopen. In Tabel D.2 staan enkele nuttige velden vermeld uit deze struct.

Type Naam Uitleg

int64_t pts Timestamp die aangeeft wanneer het gedecodeerd

pakket moet worden weergegeven

uint8_t * data Array van databytes

int size Aantal bytes in data

int duration Hoelang dit pakket moet worden weergegeven

Tabel D.2: Enkele velden uit de AVPacket-struct

In theorie is enkel header data uit het MP4-bestand nodig voor de berekening; het opvra-

gen van het volgend AVPacket uit de gelinkte lijst faalt echter waar het volgend AVPacket

zou overeenkomen met weggelaten databytes. In de praktijk faalt dit bij de eerste opvraging,

aangezien we enkel over header data beschikken. M.b.v. Isoviewer werd dan berekend hoeveel

databytes nodig waren voor bijvoorbeeld exact de eerste 4 pakketten. FFmpeg liep in dat geval

Page 69: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

FFMPEG 57

inderdaad vast bij de 5de iteratie. Deze test toont aan dat header data volstaat voor de bereken-

ing, althans in het geval van een MP4-bestand. Het feit dat FFmpeg dit niet zo implementeert,

kan te maken hebben met abstractielagen om compatibel te zijn met andere formaten die niet

over dergelijke header data beschikken.

Page 70: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

TRAJECT-URI FORMAATSPECIFICATIE 58

Bijlage E

Traject-URI formaatspecificatie

trajprefix = %x74.72.61.6A ; "traj"

trajunitparam = [ xywhunit ":" ] trajparam

xywhunit = %x70.69.78.65.6C ; "pixel"

/ %x70.65.72.63.65.6E.74 ; "percent"

trajparam = xywh ";" flag

flag = flagk / flagi

flagk = "k" [ ";" midpoint ]

flagi = "i" ";" point

midpoint = xywh ";" npttime ";" flag

point = xywh ";" [ npttime ";" flag ]

xywh = 1*DIGIT "," 1*DIGIT "," 1*DIGIT "," 1*DIGIT

Page 71: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

BIBLIOGRAFIE 59

Bibliografie

[1] T. Berners-Lee, R. Fielding, and L. Masinter. Uniform Resource Identifier (URI): Generic

Syntax, pages 24–25. IETF, 2005. Beschikbaar op http://tools.ietf.org/html/

rfc3986#section-3.5.

[2] Ian Hickson. HTML5 - A vocabulary and associated APIs for HTML and XHTML, W3C

Working Draft. Beschikbaar op http://www.w3.org/TR/html5/.

[3] ISO/IEC. ISO/IEC 14496-12: Information technology — Coding of audio-visual objects

part 12: Iso base media file format. 2008.

[4] Erik Mannens, Davy Van Deursen, Raphael Troncy, Silvia Pfeiffer, Conrad Parker, Yves

Lafon, Jack Jansen, Michael Hausenblas, and Rik Van de Walle. A URI-based Approach

for Addressing Fragments of Media Resources on the Web. Technical report.

[5] Adobe Solutions Network. PDF Open Parameters, pages 7–8. Adobe Systems Inc.,

2005. Beschikbaar op http://partners.adobe.com/public/developer/en/acrobat/

PDFOpenParameters.pdf.

[6] Dave Raggett, Arnaud Le Hors, and Ian Jacobs. HTML 4.0 Specification, W3C Recom-

mendation. Beschikbaar op http://www.w3.org/TR/1998/REC-html40-19980424/.

[7] Jakub Sendor. Implementing the Media Fragments URI Specification: Media Fragments

Firefox Extension. Technical report. Beschikbaar op http://www.w3.org/2008/WebVideo/

Fragments/talks/2010-06-30-Jakub_Sendor-Media_Fragment_Firefox_Plugin.pdf.

[8] Raphael Troncy, Erik Mannens, Silvia Pfeiffer, and Davy Van Deursen. Media Fragments

URI 1.0 (basic), W3C Proposed Recommendation. Beschikbaar op http://www.w3.org/

TR/media-frags/.

Page 72: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

BIBLIOGRAFIE 60

[9] Raphael Troncy, Erik Mannens, Silvia Pfeiffer, and Davy Van Deursen. Media Frag-

ments URI 1.0, W3C Working Draft. Beschikbaar op http://www.w3.org/TR/2010/

WD-media-frags-20100624/.

[10] E. Wilde and M. Duerst. URI Fragment Identifiers for the text/plain Media Type. Beschik-

baar op http://tools.ietf.org/html/rfc5147.

Page 73: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

LIJST VAN FIGUREN 61

Lijst van figuren

2.1 HTTP-verkeer bij een temporeel fragment . . . . . . . . . . . . . . . . . . . . . . 15

3.1 Niet gedownloade data wordt vervangen door nullen. . . . . . . . . . . . . . . . . 19

3.2 Bandbreedtebesparing met een proxyserver . . . . . . . . . . . . . . . . . . . . . 23

4.1 Hoofdstructuur van de Media Fragments-parser . . . . . . . . . . . . . . . . . . . 30

4.2 Architectuur van de Media Fragments-parser . . . . . . . . . . . . . . . . . . . . 31

4.3 Logging-architectuur van de Media Fragments-parser . . . . . . . . . . . . . . . . 34

5.1 Het starten van een Activity vanuit de huidige Activity . . . . . . . . . . . . . 36

5.2 De eerste twee schermen van de Media Fragments-app . . . . . . . . . . . . . . . 38

5.3 De videospeler in portretmodus . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

5.4 Inzoomen op een spatiaal fragment . . . . . . . . . . . . . . . . . . . . . . . . . . 39

5.5 De videospeler in landschapsmodus . . . . . . . . . . . . . . . . . . . . . . . . . . 39

6.1 Schematische voorstelling van een traject . . . . . . . . . . . . . . . . . . . . . . 43

6.2 De ’keep’-vlag als laatste vlag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

6.3 Uitbreiding van de Media Fragments-parser voor spatiaal-temporele fragmentatie 45

6.4 Omzetting naar arraywaarden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

6.5 Interpolatie in spatiaal-temporele fragmentatie . . . . . . . . . . . . . . . . . . . 47

A.1 De Android emulator met SDK 10, onder Ubuntu 11.10. . . . . . . . . . . . . . . 51

Page 74: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot

LIJST VAN TABELLEN 62

Lijst van tabellen

1.2 Bestaande URI-fragments voor bepaalde MIME-types . . . . . . . . . . . . . . . 4

2.1 Historiek van de Media Fragments-specificatie . . . . . . . . . . . . . . . . . . . . 13

4.2 AbstractValueParser-, AbstractValue- en Suffix-implementaties . . . . . . . 28

A.2 Een greep uit de verschillende Android-versies . . . . . . . . . . . . . . . . . . . . 50

D.2 Enkele velden uit de AVPacket-struct . . . . . . . . . . . . . . . . . . . . . . . . . 56

Page 75: Implementatie en uitbreiding van de Media Fragments-speci ... · Implementatie en uitbreiding van de Media Fragments-speci catie op Android door Tim DE MEY Masterproef ingediend tot