[RFC] first draft of stream/demux-metadata support (+playlist-infos)

Fabian Franz <[email protected]>
Newsgroups gmane.comp.video.mplayer.g2.devel
Message-ID <[email protected]>
Hi,

I slept a while and think I found the different types, that need to be 
supported (supposed playlist-handlers will be complete in demuxer-level too)

To-be-supported Examples:

QT-MOVIE: (or other playlist)

Metadata:

Title: Foo's adventure
Author: Bar Bar cue
Date: 2005

References:
        (Ext-)Reference: 
                url: foo-high-res.mov
                bitrate: 16000
                quality: 9
                --
                url: foo-medi-res.mov
                --
                url: foo-low-res1.mov
                --
                url: foo-low-res2.mov
        (Ext-)Reference:
                url: foo-title2.mov
DVD:

Metadata:

Title: Foo on DVD
Author: Bar Bar Cue
Date: 2005

DVD-META:

Titles: 16
Chapters: 25
Subtitle-Languages: de en uk fr
Audio-Languages: de en

References:
        (Int-)Reference: 
                name: Main-Movie (title1)
                offset: 1656
                (Int-)Reference:
                        name: Chapter 1
                        offset: 1656
                (Int-)Reference:
                        name: Chapter 2
                        offset: 1856
                   ...
        (Int-)Reference:
                name: title2
                offset: 1987
                
CD:

Metadata:

Title: Bar is singing
Author: Foo's hidden microphone
Date: 2008

CD-META:

nb_tracks = 16
length = 00:57:68

References:
        (Int-)Reference:
                name: Foo Title 1
                offset: 108
        (Int-)Reference:
                name: Foo Title 2
                offset: 206

Proposed structures:

-> Metadata as list. (as already implemented)
<SPEC>-META as an struct specific to media.

Reference: (somewaht similar to metadata, which should not be specific to 
demuxer-level)

struct ref_list_s;

typedef struct ref_entry_s
{
  char* name;
  int offset;
  Url_t *URL;
  int bitrate; // perhaps present in Url_t ?
  int quality;
  ...
  int type; // external / internal reference
  ref_list_t* alternatives;
  ref_list_t* sublist;
} ref_entry_t;

typedef struct ref_list_s {
  int num_refs; // number of available entries
  int max_refs; // number of allocated entries 
(if(num_metas>=max_metas)realloc())
  ref_entry_t* refs;
} ref_list_t;
      

So CD is a flat structure, which do not use alternatives or sublist.
MOV can make use of alternatives to allow player an choice.
DVD does make heavy use of sublist, as disk/titles/chapters have a somewaht 
nested strucutre.

One goal in later implementation should be simplicity.

num=add_ext_reference(reflist,name, url) // returns the index ...
add_ext_reference_alternative(reflist,num, name, url, bitrate, quality, ...)
add_ext_reference_alternative(reflist,num, name2, url2, bitrate2, quality2, 
...)

num=add_reference(reflist,dvdname, offset) // returns the index ...
add_reference_sublist(reflist,num, chaptername, offset)
add_reference_sublist(reflist,num, chaptername2, offset2)

Later CONTROL-program can get the data via:

for (i=0;i<reflist.num_refs;i++)
{
  printf("Name: %s\n",reflist.refs[i]->name);
}

Convert it into own playlist/playtree-format and so on...

The whole thing shall be in stream_t stream* as 

meta_t *meta 
{
  metadata_list_t data;
  void* specific_data; // or struct some_specific_s (like stream_priv_s)
  ref_list_t list;
}

or similar.

cu

Fabian
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.