libmediainfo 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,33 @@
1
+ #ifndef GEM_MEDIAINFO_MEDIAINFO_H
2
+ #define GEM_MEDIAINFO_MEDIAINFO_H
3
+
4
+ extern VALUE cMediaInfo;
5
+
6
+ struct mediainfo {
7
+ void *handle;
8
+
9
+ VALUE path;
10
+
11
+ VALUE stream_types;
12
+ VALUE tracks;
13
+
14
+ VALUE general;
15
+ VALUE video;
16
+ VALUE audio;
17
+ VALUE text;
18
+ VALUE chapters;
19
+ VALUE image;
20
+ VALUE menu;
21
+ };
22
+ typedef struct mediainfo mediainfo_t;
23
+
24
+ #define GET_MEDIAINFO(mi, selfptr) \
25
+ GET_CLASS_STRUCT(mediainfo_t, mi, selfptr)
26
+ #define UNPACK_MI GET_MEDIAINFO(mi, self)
27
+
28
+ VALUE mediainfo_get_i(VALUE self, VALUE stream_type, VALUE stream_id, VALUE field_id, VALUE request_type);
29
+ VALUE mediainfo_count_get(VALUE self, VALUE stream_type, VALUE stream_id);
30
+
31
+ void Init_mediainfo_Mediainfo(void);
32
+
33
+ #endif /*GEM_MEDIAINFO_MEDIAINFO_H*/
@@ -0,0 +1,171 @@
1
+ #include "common.h"
2
+ #include "mediainfo.h"
3
+ #include "stream_type.h"
4
+ #include "track.h"
5
+
6
+ VALUE cMediaInfo_cStreamType;
7
+
8
+ const char *
9
+ mediainfo_stream_type_to_name(int stream_type)
10
+ {
11
+ switch(stream_type) {
12
+ case MediaInfo_Stream_General: return "general";
13
+ case MediaInfo_Stream_Video: return "video";
14
+ case MediaInfo_Stream_Audio: return "audio";
15
+ case MediaInfo_Stream_Text: return "text";
16
+ case MediaInfo_Stream_Chapters: return "chapters";
17
+ case MediaInfo_Stream_Image: return "image";
18
+ case MediaInfo_Stream_Menu: return "menu";
19
+ default: return "unknown";
20
+ }
21
+ }
22
+
23
+ static mediainfo_stream_type_t *
24
+ mediainfo_stream_type_t_alloc()
25
+ {
26
+ mediainfo_stream_type_t *st;
27
+ st = ALLOC(mediainfo_stream_type_t);
28
+ st->mediainfo = Qnil;
29
+ st->tracks = Qnil;
30
+ st->num_tracks = 0;
31
+ return st;
32
+ }
33
+
34
+ static void
35
+ mediainfo_stream_type_free(mediainfo_stream_type_t *st)
36
+ {
37
+ xfree(st);
38
+ }
39
+
40
+ static void
41
+ mediainfo_stream_type_mark(mediainfo_stream_type_t *st)
42
+ {
43
+ MARK(st->mediainfo);
44
+ MARK(st->name);
45
+ MARK(st->tracks);
46
+ }
47
+
48
+
49
+ static VALUE
50
+ mediainfo_stream_type_allocate(VALUE klass)
51
+ {
52
+ mediainfo_stream_type_t *st = mediainfo_stream_type_t_alloc();
53
+ st->tracks = rb_ary_new();
54
+ return Data_Wrap_Struct(klass,
55
+ mediainfo_stream_type_mark,
56
+ mediainfo_stream_type_free,
57
+ st);
58
+ }
59
+
60
+ #define GETTER(name) \
61
+ static VALUE \
62
+ JOIN(mediainfo_stream_type_get_,name)(VALUE self) \
63
+ { \
64
+ UNPACK_STREAM_TYPE; \
65
+ return st->name; \
66
+ }
67
+ GETTER(mediainfo);
68
+ GETTER(tracks);
69
+ GETTER(name);
70
+ #undef GETTER
71
+
72
+ static VALUE
73
+ mediainfo_stream_type_load_tracks(VALUE self)
74
+ {
75
+ int i;
76
+ size_t n;
77
+ VALUE rn;
78
+ VALUE track;
79
+ VALUE argv[3];
80
+ UNPACK_STREAM_TYPE;
81
+ GET_MEDIAINFO(mi, st->mediainfo);
82
+
83
+ argv[0] = st->mediainfo;
84
+ argv[1] = self;
85
+ rn = mediainfo_count_get(st->mediainfo, INT2NUM(st->type), INT2NUM(-1));
86
+ st->num_tracks = NUM2INT(rn);
87
+
88
+ for (i = 0; i < st->num_tracks; i++) {
89
+ argv[2] = INT2NUM(i);
90
+ track = rb_class_new_instance(3, argv, cMediaInfo_cTrack);
91
+ rb_ary_push(st->tracks, track);
92
+ rb_ary_push(mi->tracks, track);
93
+ }
94
+ return self;
95
+ }
96
+
97
+ static VALUE
98
+ mediainfo_stream_type_initialize(VALUE self, VALUE mediainfo, VALUE stream_type)
99
+ {
100
+ UNPACK_STREAM_TYPE;
101
+ st->mediainfo = mediainfo;
102
+ st->type = NUM2INT(stream_type);
103
+ st->cname = mediainfo_stream_type_to_name(st->type);
104
+ st->name = rb_str_new2(st->cname);
105
+ return mediainfo_stream_type_load_tracks(self);
106
+ }
107
+
108
+ static VALUE
109
+ mediainfo_stream_type_inspect(VALUE self)
110
+ {
111
+ char *buf;
112
+ UNPACK_STREAM_TYPE;
113
+
114
+ #define INSPECT_FMT "#<MediaInfo::StreamType num_tracks=%zd>"
115
+ buf = alloca(8 + sizeof(INSPECT_FMT));
116
+ sprintf(buf, INSPECT_FMT, st->num_tracks);
117
+ #undef INSPECT_FMT
118
+ return rb_str_new2(buf);
119
+ }
120
+
121
+ static VALUE
122
+ mediainfo_stream_type_to_s(VALUE self)
123
+ {
124
+ return mediainfo_stream_type_inspect(self);
125
+ }
126
+
127
+ static VALUE
128
+ mediainfo_stream_type_track(VALUE self, VALUE idx)
129
+ {
130
+ UNPACK_STREAM_TYPE;
131
+ return rb_ary_entry(st->tracks, NUM2INT(idx));
132
+ }
133
+
134
+ static VALUE
135
+ mediainfo_stream_type_each(VALUE self)
136
+ {
137
+ UNPACK_STREAM_TYPE;
138
+ return rb_ary_each(st->tracks);
139
+ }
140
+
141
+ void
142
+ Init_mediainfo_MediaInfo_StreamType(void)
143
+ {
144
+ cMediaInfo_cStreamType = rb_define_class_under(cMediaInfo,
145
+ "StreamType",
146
+ rb_cObject);
147
+ rb_define_alloc_func(cMediaInfo_cStreamType,
148
+ mediainfo_stream_type_allocate);
149
+
150
+ #define GET(name) \
151
+ rb_define_method(cMediaInfo_cStreamType, \
152
+ Q(name), \
153
+ JOIN(mediainfo_stream_type_get_,name), \
154
+ 0);
155
+ GET(mediainfo);
156
+ GET(tracks);
157
+ GET(name);
158
+ #undef GET
159
+
160
+ #define M(suffix, name, numargs) \
161
+ rb_define_method(cMediaInfo_cStreamType, \
162
+ name, \
163
+ JOIN(mediainfo_stream_type_,suffix), \
164
+ numargs);
165
+ M(initialize, "initialize", 2);
166
+ M(to_s, "to_s", 0);
167
+ M(track, "track", 1);
168
+ M(track, "[]", 1);
169
+ M(each, "each", 0);
170
+ #undef M
171
+ }
@@ -0,0 +1,26 @@
1
+ #ifndef GEM_MEDIAINFO_STREAM_TYPE_H
2
+ #define GEM_MEDIAINFO_STREAM_TYPE_H
3
+
4
+ const char *mediainfo_stream_type_to_name(int stream_type);
5
+
6
+ extern VALUE cMediaInfo_cStreamType;
7
+
8
+ struct mediainfo_stream_type {
9
+ VALUE mediainfo;
10
+
11
+ int type;
12
+ const char *cname;
13
+ VALUE name;
14
+ VALUE tracks;
15
+ size_t num_tracks;
16
+ };
17
+ typedef struct mediainfo_stream_type mediainfo_stream_type_t;
18
+
19
+ #define GET_MEDIAINFO_STREAM_TYPE(st, selfptr) \
20
+ GET_CLASS_STRUCT(mediainfo_stream_type_t, st, selfptr)
21
+
22
+ #define UNPACK_STREAM_TYPE GET_MEDIAINFO_STREAM_TYPE(st, self)
23
+
24
+ void Init_mediainfo_MediaInfo_StreamType(void);
25
+
26
+ #endif /*GEM_MEDIAINFO_STREAM_TYPE_H*/
@@ -0,0 +1,205 @@
1
+ #include "common.h"
2
+ #include "mediainfo.h"
3
+ #include "stream_type.h"
4
+ #include "track.h"
5
+
6
+ VALUE cMediaInfo_cTrack;
7
+
8
+ static mediainfo_track_t *
9
+ mediainfo_track_t_alloc()
10
+ {
11
+ mediainfo_track_t *track;
12
+ track = ALLOC(mediainfo_track_t);
13
+ track->mediainfo = Qnil;
14
+ track->fields = Qnil;
15
+ track->stream_type = Qnil;
16
+ track->id = 0;
17
+ return track;
18
+ }
19
+
20
+ static void
21
+ mediainfo_track_free(mediainfo_track_t *track)
22
+ {
23
+ xfree(track);
24
+ }
25
+
26
+ static void
27
+ mediainfo_track_mark(mediainfo_track_t *track)
28
+ {
29
+ MARK(track->mediainfo);
30
+ MARK(track->fields);
31
+ MARK(track->stream_type);
32
+ }
33
+
34
+ static VALUE
35
+ mediainfo_track_allocate(VALUE klass) {
36
+ mediainfo_track_t *track = mediainfo_track_t_alloc();
37
+ track->fields = rb_hash_new();
38
+ return Data_Wrap_Struct(klass,
39
+ mediainfo_track_mark,
40
+ mediainfo_track_free,
41
+ track);
42
+ }
43
+
44
+ static VALUE
45
+ mediainfo_track_compare(VALUE self, VALUE other)
46
+ {
47
+ GET_MEDIAINFO_TRACK(a, self);
48
+ GET_MEDIAINFO_TRACK(b, other);
49
+
50
+ if (rb_obj_class(other) == cMediaInfo_cTrack) {
51
+ if (a->id < b->id) { return -1; }
52
+ if (a->id < b->id) { return 1; }
53
+ return INT2NUM(0);
54
+ } else {
55
+ return rb_funcall(a->mediainfo, rb_intern("<=>"), 1, b->mediainfo);
56
+ }
57
+ }
58
+
59
+ #define GETTER(name) \
60
+ static VALUE \
61
+ JOIN(mediainfo_track_get_,name)(VALUE self) \
62
+ { \
63
+ UNPACK_TRACK; \
64
+ return track->name; \
65
+ }
66
+ GETTER(mediainfo);
67
+ GETTER(stream_type);
68
+ GETTER(fields);
69
+ GETTER(id);
70
+ #undef GETTER
71
+
72
+ static VALUE
73
+ mediainfo_track_field(VALUE self, VALUE field_name)
74
+ {
75
+ VALUE val;
76
+ UNPACK_TRACK;
77
+ val = rb_hash_lookup(track->fields, field_name);
78
+ if (!val) {
79
+ rb_raise(rb_eKeyError,
80
+ "No such field: \"%s\"",
81
+ RSTRING_PTR(field_name));
82
+ }
83
+ return val;
84
+ }
85
+
86
+ static VALUE
87
+ mediainfo_track_load_fields(VALUE self)
88
+ {
89
+ int i;
90
+ VALUE rtype, rn, ri, name, text;
91
+ UNPACK_TRACK;
92
+ GET_MEDIAINFO(mi, track->mediainfo);
93
+ GET_MEDIAINFO_STREAM_TYPE(st, track->stream_type);
94
+
95
+ rtype = INT2NUM(st->type);
96
+ rn = mediainfo_count_get(track->mediainfo, rtype, track->id);
97
+ track->num_fields = NUM2INT(rn);
98
+
99
+ for (i = 0; i < track->num_fields; i++) {
100
+ ri = INT2NUM(i);
101
+ name = mediainfo_get_i(track->mediainfo, rtype, track->id, ri, INT2NUM(MediaInfo_Info_Name));
102
+ text = mediainfo_get_i(track->mediainfo, rtype, track->id, ri, INT2NUM(MediaInfo_Info_Text));
103
+ if (text != Qnil) {
104
+ rb_hash_aset(track->fields, name, text);
105
+ }
106
+ }
107
+ }
108
+
109
+ static VALUE
110
+ mediainfo_track_initialize(VALUE self, VALUE mediainfo, VALUE stream_type, VALUE track_id)
111
+ {
112
+ UNPACK_TRACK;
113
+ GET_MEDIAINFO_STREAM_TYPE(st, stream_type);
114
+
115
+ track->mediainfo = mediainfo;
116
+ track->stream_type = stream_type;
117
+ track->id = track_id;
118
+ track->id_int = NUM2INT(track_id);
119
+ return mediainfo_track_load_fields(self);
120
+ }
121
+
122
+ static VALUE
123
+ mediainfo_track_inspect(VALUE self)
124
+ {
125
+ char *buf;
126
+ UNPACK_TRACK;
127
+
128
+ if (track->id == Qnil) {
129
+ return rb_str_new2("#<MediaInfo::Track nil>");
130
+ } else if (track->fields == Qnil) {
131
+ #define INSPECT_FMT "#<MediaInfo::Track id=%d>"
132
+ buf = alloca(8 + sizeof(INSPECT_FMT));
133
+ sprintf(buf, INSPECT_FMT, track->id_int);
134
+ #undef INSPECT_FMT
135
+ return rb_str_new2(buf);
136
+ } else {
137
+ #define INSPECT_FMT "#<MediaInfo::Track id=%d num_fields=%d>"
138
+ buf = alloca(16 + sizeof(INSPECT_FMT));
139
+ sprintf(buf, INSPECT_FMT, track->id_int, track->num_fields);
140
+ #undef INSPECT_FMT
141
+ return rb_str_new2(buf);
142
+ }
143
+ }
144
+
145
+ int do_each_pair(VALUE key, VALUE val, VALUE data)
146
+ {
147
+ rb_yield_values(2, key, val);
148
+ return ST_CONTINUE;
149
+ }
150
+
151
+ static VALUE
152
+ mediainfo_track_keys(VALUE self)
153
+ {
154
+ UNPACK_TRACK;
155
+ return rb_funcall(track->fields, rb_intern("keys"), 0);
156
+ }
157
+
158
+ static VALUE
159
+ mediainfo_track_each(VALUE self)
160
+ {
161
+ UNPACK_TRACK;
162
+ rb_need_block();
163
+ rb_hash_foreach(track->fields, do_each_pair, Qnil);
164
+ return self;
165
+ }
166
+
167
+ static VALUE
168
+ mediainfo_track_to_s(VALUE self)
169
+ {
170
+ return mediainfo_track_inspect(self);
171
+ }
172
+
173
+ void Init_mediainfo_MediaInfo_Track(void)
174
+ {
175
+ cMediaInfo_cTrack = rb_define_class_under(cMediaInfo, "Track", rb_cObject);
176
+ rb_define_alloc_func(cMediaInfo_cTrack, mediainfo_track_allocate);
177
+
178
+ #define GET(name) \
179
+ rb_define_method(cMediaInfo_cTrack, \
180
+ Q(name), \
181
+ JOIN(mediainfo_track_get_,name), \
182
+ 0);
183
+ GET(mediainfo);
184
+ GET(stream_type);
185
+ GET(fields);
186
+ GET(id);
187
+ #undef GET
188
+
189
+ #define M(suffix, name, numargs) \
190
+ rb_define_method(cMediaInfo_cTrack, \
191
+ name, \
192
+ JOIN(mediainfo_track_,suffix), \
193
+ numargs);
194
+ M(compare, "<=>", 1);
195
+ M(field, "[]", 1);
196
+ M(field, "field", 1);
197
+ M(get_mediainfo, "mediainfo", 0);
198
+ M(get_fields, "fields", 0);
199
+ M(initialize, "initialize", 3);
200
+ M(to_s, "to_s", 0);
201
+ M(keys, "keys", 0);
202
+ M(each, "each", 0);
203
+ M(each, "each_field", 0);
204
+ #undef M
205
+ }
@@ -0,0 +1,24 @@
1
+ #ifndef GEM_MEDIAINFO_TRACK_H
2
+ #define GEM_MEDIAINFO_TRACK_H
3
+
4
+ extern VALUE cMediaInfo_cTrack;
5
+
6
+ struct mediainfo_track {
7
+ VALUE mediainfo;
8
+ VALUE stream_type;
9
+
10
+ VALUE id;
11
+ int id_int;
12
+ int num_fields;
13
+ VALUE fields;
14
+ };
15
+ typedef struct mediainfo_track mediainfo_track_t;
16
+
17
+ #define GET_MEDIAINFO_TRACK(track, selfptr) \
18
+ GET_CLASS_STRUCT(mediainfo_track_t, track, selfptr)
19
+
20
+ #define UNPACK_TRACK GET_MEDIAINFO_TRACK(track, self)
21
+
22
+ void Init_mediainfo_MediaInfo_Track(void);
23
+
24
+ #endif /*GEM_MEDIAINFO_TRACK_H*/