libmediainfo 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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*/