31
32
#include "libavutil/common.h"
34
#ifdef CONFIG_QTX_CODECS
34
35
#include "loader/qtx/qtxsdk/components.h"
41
#ifdef USE_LIBAVUTIL_SO
42
#include <ffmpeg/lzo.h>
43
#include <ffmpeg/intreadwrite.h>
45
42
#include "libavutil/lzo.h"
46
43
#include "libavutil/intreadwrite.h"
48
44
#include "libavutil/avstring.h"
50
static unsigned char sipr_swaps[38][2]={
46
static const unsigned char sipr_swaps[38][2]={
51
47
{0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68},
52
48
{13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46},
53
49
{25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56},
58
54
#define SIPR_FLAVORS 4
59
55
#define ATRC_FLAVORS 8
60
56
#define COOK_FLAVORS 34
61
static int sipr_fl2bps[SIPR_FLAVORS] = {813, 1062, 625, 2000};
62
static int atrc_fl2bps[ATRC_FLAVORS] = {8269, 11714, 13092, 16538, 18260, 22050, 33075, 44100};
63
static int cook_fl2bps[COOK_FLAVORS] = {1000, 1378, 2024, 2584, 4005, 5513, 8010, 4005, 750, 2498,
64
4048, 5513, 8010, 11973, 8010, 2584, 4005, 2067, 2584, 2584,
65
4005, 4005, 5513, 5513, 8010, 12059, 1550, 8010, 12059, 5513,
66
12016, 16408, 22911, 33506};
57
static const int sipr_fl2bps[SIPR_FLAVORS] = {813, 1062, 625, 2000};
58
static const int atrc_fl2bps[ATRC_FLAVORS] =
59
{8269, 11714, 13092, 16538, 18260, 22050, 33075, 44100};
60
static const int cook_fl2bps[COOK_FLAVORS] =
61
{ 1000, 1378, 2024, 2584, 4005, 5513, 8010, 4005, 750, 2498,
62
4048, 5513, 8010, 11973, 8010, 2584, 4005, 2067, 2584, 2584,
63
4005, 4005, 5513, 5513, 8010, 12059, 1550, 8010, 12059, 5513,
64
12016, 16408, 22911, 33506};
228
demux_mkv_find_track_by_language (mkv_demuxer_t *d, char *language, int type)
232
language += strspn(language,",");
233
while((len = strcspn(language,",")) > 0)
235
for (i=0; i < d->num_tracks; i++)
236
if (d->tracks[i] != NULL && d->tracks[i]->language != NULL &&
237
d->tracks[i]->type == type &&
238
!strncmp(d->tracks[i]->language, language, len))
241
language += strspn(language,",");
248
215
add_cluster_position (mkv_demuxer_t *mkv_d, uint64_t position)
294
vobsub_parse_size (sh_sub_t *sh, const char *start)
296
if (sscanf(&start[6], "%dx%d", &sh->width, &sh->height) == 2)
298
mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub size: %ux%u\n",
299
sh->width, sh->height);
306
vobsub_parse_palette (sh_sub_t *sh, const char *start)
308
int i, r, g, b, y, u, v, tmp;
311
while (isspace(*start))
313
for (i = 0; i < 16; i++)
315
if (sscanf(start, "%06x", &tmp) != 1)
317
r = tmp >> 16 & 0xff;
320
y = av_clip_uint8( 0.1494 * r + 0.6061 * g + 0.2445 * b);
321
u = av_clip_uint8( 0.6066 * r - 0.4322 * g - 0.1744 * b + 128);
322
v = av_clip_uint8(-0.08435 * r - 0.3422 * g + 0.4266 * b + 128);
323
sh->palette[i] = y << 16 | u << 8 | v;
325
while ((*start == ',') || isspace(*start))
330
mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub palette: %06x,%06x,"
331
"%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,"
332
"%06x,%06x,%06x\n", sh->palette[0],
333
sh->palette[1], sh->palette[2],
334
sh->palette[3], sh->palette[4],
335
sh->palette[5], sh->palette[6],
336
sh->palette[7], sh->palette[8],
337
sh->palette[9], sh->palette[10],
338
sh->palette[11], sh->palette[12],
339
sh->palette[13], sh->palette[14],
348
vobsub_parse_custom_colors (sh_sub_t *sh, const char *start)
350
int use_custom_colors, i;
352
use_custom_colors = 0;
354
while (isspace(*start))
356
if (!strncasecmp(start, "ON", 2) || (*start == '1'))
357
use_custom_colors = 1;
358
else if (!strncasecmp(start, "OFF", 3) || (*start == '0'))
359
use_custom_colors = 0;
360
mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub custom colors: %s\n",
361
use_custom_colors ? "ON" : "OFF");
362
if ((start = strstr(start, "colors:")) != NULL)
365
while (isspace(*start))
367
for (i = 0; i < 4; i++)
369
if (sscanf(start, "%06x", &sh->colors[i]) != 1)
372
while ((*start == ',') || isspace(*start))
377
sh->custom_colors = 4;
378
mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub colors: %06x,"
379
"%06x,%06x,%06x\n", sh->colors[0],
380
sh->colors[1], sh->colors[2],
384
if (!use_custom_colors)
385
sh->custom_colors = 0;
390
vobsub_parse_forced_subs (sh_sub_t *sh, const char *start)
393
while (isspace(*start))
395
if (!strncasecmp(start, "on", 2) || (*start == '1'))
396
sh->forced_subs_only = 1;
397
else if (!strncasecmp(start, "off", 3) || (*start == '0'))
398
sh->forced_subs_only = 0;
401
mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub forced subs: %d\n",
402
sh->forced_subs_only);
406
259
/** \brief Free cached demux packets
408
261
* Reordering the timecodes requires caching of demux packets. This function
435
demux_mkv_parse_idx (mkv_track_t *t)
437
int things_found, last;
438
char *buf, *pos, *start;
440
if ((t->private_data == NULL) || (t->private_size == 0))
444
buf = malloc(t->private_size + 1);
447
memcpy(buf, t->private_data, t->private_size);
448
buf[t->private_size] = 0;
449
t->sh_sub->has_palette = 0;
456
if ((*pos == 0) || (*pos == '\r') || (*pos == '\n'))
462
if (!strncasecmp(start, "size: ", 6))
463
things_found |= vobsub_parse_size(t->sh_sub, start);
464
else if (!strncasecmp(start, "palette:", 8))
465
things_found |= vobsub_parse_palette(t->sh_sub, start);
466
else if (!strncasecmp(start, "custom colors:", 14))
467
things_found |= vobsub_parse_custom_colors(t->sh_sub, start);
468
else if (!strncasecmp(start, "forced subs:", 12))
469
things_found |= vobsub_parse_forced_subs(t->sh_sub, start);
477
while ((*pos == '\r') || (*pos == '\n'));
483
while (!last && (*start != 0));
487
return (things_found & 3) == 3;
492
288
demux_mkv_decode (mkv_track_t *track, uint8_t *src, uint8_t **dest,
493
289
uint32_t *size, uint32_t type)
558
354
int srclen = *size;
559
if (dstlen > SIZE_MAX - LZO_OUTPUT_PADDING) goto lzo_fail;
560
*dest = realloc (*dest, dstlen + LZO_OUTPUT_PADDING);
561
result = lzo1x_decode (*dest, &dstlen, src, &srclen);
355
if (dstlen > SIZE_MAX - AV_LZO_OUTPUT_PADDING) goto lzo_fail;
356
*dest = realloc (*dest, dstlen + AV_LZO_OUTPUT_PADDING);
357
result = av_lzo1x_decode (*dest, &dstlen, src, &srclen);
564
if (!(result & LZO_OUTPUT_FULL))
360
if (!(result & AV_LZO_OUTPUT_FULL))
567
363
mp_msg (MSGT_DEMUX, MSGL_WARN,
1524
mkv_d->attachments[mkv_d->num_attachments].name = name;
1525
mkv_d->attachments[mkv_d->num_attachments].mime = mime;
1526
mkv_d->attachments[mkv_d->num_attachments].uid = uid;
1527
mkv_d->attachments[mkv_d->num_attachments].data = data;
1528
mkv_d->attachments[mkv_d->num_attachments].data_size = data_size;
1529
mkv_d->num_attachments ++;
1301
demuxer_add_attachment(demuxer, name, mime, data, data_size);
1530
1302
mp_msg(MSGT_DEMUX, MSGL_V,
1531
1303
"[mkv] Attachment: %s, %s, %u bytes\n",
1532
1304
name, mime, data_size);
1535
extract_embedded_fonts && name && data && data_size &&
1536
mime && (strcmp(mime, "application/x-truetype-font") == 0 ||
1537
strcmp(mime, "application/x-font") == 0))
1538
ass_add_font(ass_library, name, data, data_size);
1966
1734
track->a_formattag = mmioFOURCC('Q', 'D', 'M', 'C');
1967
1735
else if (!strcmp(track->codec_id, MKV_A_QDMC2))
1968
1736
track->a_formattag = mmioFOURCC('Q', 'D', 'M', '2');
1737
else if (!strcmp(track->codec_id, MKV_A_WAVPACK))
1738
track->a_formattag = mmioFOURCC('W', 'V', 'P', 'K');
1969
1739
else if (!strcmp(track->codec_id, MKV_A_FLAC))
1971
1741
if (track->private_data == NULL || track->private_size == 0)
2217
/** \brief Parse the private data for VobSub subtitle tracks.
2219
This function tries to parse the private data for all VobSub tracks.
2220
The private data contains the normal text from the original .idx file.
2221
Things like the palette, subtitle dimensions and custom colors are
2224
\param demuxer The generic demuxer.
2227
demux_mkv_parse_vobsub_data (demuxer_t *demuxer)
2229
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2234
for (i = 0; i < mkv_d->num_tracks; i++)
2236
track = mkv_d->tracks[i];
2237
if ((track->type != MATROSKA_TRACK_SUBTITLE) ||
2238
(track->subtitle_type != MATROSKA_SUBTYPE_VOBSUB))
2241
size = track->private_size;
2242
m = demux_mkv_decode (track,track->private_data,&buffer,&size,2);
2245
free (track->private_data);
2246
track->private_data = buffer;
2247
track->private_size = size;
2249
if (!demux_mkv_parse_idx (track))
2251
free (track->private_data);
2252
track->private_data = NULL;
2253
track->private_size = 0;
2258
/** \brief Parse the private data for SSA/ASS subtitle tracks.
2260
This function tries to parse the private data for all SSA/ASS tracks.
2261
The private data contains the normal text from the original script,
2262
from the start to the beginning of 'Events' section, including '[Events]' line.
2264
\param demuxer The generic demuxer.
2268
demux_mkv_parse_ass_data (demuxer_t *demuxer)
2270
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2275
for (i = 0; i < mkv_d->num_tracks; i++)
2277
track = mkv_d->tracks[i];
2278
if (track->type != MATROSKA_TRACK_SUBTITLE ||
2279
track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB)
2282
if (track->subtitle_type == MATROSKA_SUBTYPE_SSA)
2284
track->sh_sub->ass_track = ass_new_track(ass_library);
2285
size = track->private_size;
2286
m = demux_mkv_decode (track,track->private_data,&buffer,&size,2);
2289
free (track->private_data);
2290
track->private_data = buffer;
2291
track->private_size = size;
2293
ass_process_codec_private(track->sh_sub->ass_track, track->private_data, track->private_size);
2300
1990
demux_mkv_open_sub (demuxer_t *demuxer, mkv_track_t *track, int sid)
2302
1992
if (track->subtitle_type != MATROSKA_SUBTYPE_UNKNOWN)
2304
1996
sh_sub_t *sh = new_sh_sub_sid(demuxer, track->tnum, sid);
2305
1997
track->sh_sub = sh;
2306
1998
sh->type = 't';
2308
2000
sh->type = 'v';
2309
2001
if (track->subtitle_type == MATROSKA_SUBTYPE_SSA)
2310
2002
sh->type = 'a';
2003
size = track->private_size;
2004
m = demux_mkv_decode (track,track->private_data,&buffer,&size,2);
2007
free (track->private_data);
2008
track->private_data = buffer;
2009
track->private_size = size;
2011
sh->extradata=malloc(track->private_size);
2012
memcpy (sh->extradata, track->private_data,
2013
track->private_size);
2014
sh->extradata_len = track->private_size;
2015
if (track->language && (strcmp(track->language, "und") != 0))
2016
sh->lang = strdup(track->language);
2017
sh->default_track = track->default_track;
2322
2029
static void demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags);
2324
/** \brief Given a matroska track number and type, find the id that mplayer would ask for.
2325
* \param d The demuxer for which the subtitle id should be returned.
2326
* \param num The matroska track number we are looking up.
2327
* \param type The track type.
2329
static int demux_mkv_reverse_id(mkv_demuxer_t *d, int num, int type)
2333
for (i=0, id=0; i < d->num_tracks; i++)
2334
if (d->tracks[i] != NULL && d->tracks[i]->type == type) {
2335
if (d->tracks[i]->tnum == num)
2344
2032
demux_mkv_open (demuxer_t *demuxer)
2490
2178
/* select audio track */
2492
if (demuxer->audio->id == -1) /* automatically select an audio track */
2494
/* check if the user specified an audio language */
2495
if (audio_lang != NULL)
2496
track = demux_mkv_find_track_by_language(mkv_d, audio_lang,
2497
MATROSKA_TRACK_AUDIO);
2499
/* no audio language specified, or language not found */
2500
/* search for an audio track that has the 'default' flag set */
2501
for (i=0; i < mkv_d->num_tracks; i++)
2502
if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO
2503
&& mkv_d->tracks[i]->default_track)
2505
track = mkv_d->tracks[i];
2510
/* no track has the 'default' flag set */
2511
/* let's take the first audio track */
2512
for (i=0; i < mkv_d->num_tracks; i++)
2513
if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO)
2515
track = mkv_d->tracks[i];
2519
else if (demuxer->audio->id != -2) /* -2 = no audio at all */
2520
track = demux_mkv_find_track_by_num (mkv_d, demuxer->audio->id,
2521
MATROSKA_TRACK_AUDIO);
2181
/* search for an audio track that has the 'default' flag set */
2182
for (i=0; i < mkv_d->num_tracks; i++)
2183
if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO
2184
&& mkv_d->tracks[i]->default_track)
2186
track = mkv_d->tracks[i];
2191
/* no track has the 'default' flag set */
2192
/* let's take the first audio track */
2193
for (i=0; i < mkv_d->num_tracks; i++)
2194
if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO)
2196
track = mkv_d->tracks[i];
2522
2200
if (track && demuxer->a_streams[track->tnum])
2524
2202
demuxer->audio->id = track->tnum;
2547
demux_mkv_parse_vobsub_data (demuxer);
2550
demux_mkv_parse_ass_data (demuxer);
2552
/* DO NOT automatically select a subtitle track and behave like DVD */
2553
/* playback: only show subtitles if the user explicitely wants them. */
2555
if (demuxer->sub->id >= 0)
2556
track = demux_mkv_find_track_by_num (mkv_d, demuxer->sub->id,
2557
MATROSKA_TRACK_SUBTITLE);
2558
else if (dvdsub_lang != NULL)
2559
track = demux_mkv_find_track_by_language (mkv_d, dvdsub_lang,
2560
MATROSKA_TRACK_SUBTITLE);
2564
mp_msg (MSGT_DEMUX, MSGL_INFO,
2565
MSGTR_MPDEMUX_MKV_WillDisplaySubtitleTrack, track->tnum);
2566
dvdsub_id = demux_mkv_reverse_id(mkv_d, track->tnum, MATROSKA_TRACK_SUBTITLE);
2567
demuxer->sub->id = track->tnum;
2568
demuxer->sub->sh = demuxer->s_streams[track->tnum];
2571
demuxer->sub->id = -2;
2573
2225
if (demuxer->chapters)
2575
2227
for (i=0; i < (int)demuxer->num_chapters; i++)
2623
2265
demux_mkv_free_trackentry(mkv_d->tracks[i]);
2624
2266
free (mkv_d->tracks);
2627
free (mkv_d->indexes);
2628
if (mkv_d->cluster_positions)
2629
free (mkv_d->cluster_positions);
2630
if (mkv_d->parsed_cues)
2631
free (mkv_d->parsed_cues);
2632
if (mkv_d->parsed_seekhead)
2633
free (mkv_d->parsed_seekhead);
2634
if (mkv_d->attachments) {
2635
for (i = 0; i < mkv_d->num_attachments; ++i) {
2636
if (mkv_d->attachments[i].name)
2637
free (mkv_d->attachments[i].name);
2638
if (mkv_d->attachments[i].mime)
2639
free (mkv_d->attachments[i].mime);
2640
if (mkv_d->attachments[i].data)
2641
free (mkv_d->attachments[i].data);
2643
free (mkv_d->attachments);
2268
free (mkv_d->indexes);
2269
free (mkv_d->cluster_positions);
2270
free (mkv_d->parsed_cues);
2271
free (mkv_d->parsed_seekhead);
2751
if (ass_enabled && track->subtitle_type == MATROSKA_SUBTYPE_SSA) {
2752
ass_process_chunk(track->sh_sub->ass_track, block, size, (long long)timecode, (long long)block_duration);
2758
if (track->subtitle_type == MATROSKA_SUBTYPE_SSA)
2760
/* Find text section. */
2761
for (i=0; i < 8 && *ptr1 != '\0'; ptr1++)
2764
if (*ptr1 == '\0') /* Broken line? */
2769
size -= ptr1 - block;
2770
2376
dp = new_demux_packet(size);
2771
memcpy(dp->buffer, ptr1, size);
2377
memcpy(dp->buffer, block, size);
2772
2378
dp->pts = timecode / 1000.0f;
2773
2379
dp->endpts = (timecode + block_duration) / 1000.0f;
2774
2380
ds_add_packet(demuxer->sub, dp);
2777
// Taken from demux_real.c. Thanks to the original developpers :)
2778
#define SKIP_BITS(n) buffer <<= n
2779
#define SHOW_BITS(n) ((buffer) >> (32 - (n)))
2781
static float real_fix_timestamp(mkv_track_t *track, unsigned char *s,
2784
uint32_t buffer = (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3];
2789
if (!strcmp(track->codec_id, MKV_V_REALV30) ||
2790
!strcmp(track->codec_id, MKV_V_REALV40)) {
2792
if (!strcmp(track->codec_id, MKV_V_REALV30)) {
2794
pict_type = SHOW_BITS(2);
2798
pict_type = SHOW_BITS(2);
2799
SKIP_BITS(2 + 7 + 3);
2801
kf = SHOW_BITS(13); // kf= 2*SHOW_BITS(12);
2803
if (pict_type <= 1) {
2804
// I frame, sync timestamps:
2805
track->rv_kf_base = timestamp - kf;
2806
mp_msg(MSGT_DEMUX, MSGL_DBG2, "\nTS: base=%08X\n", track->rv_kf_base);
2809
// P/B frame, merge timestamps:
2810
int tmp = timestamp - track->rv_kf_base;
2811
kf |= tmp & (~0x1fff); // combine with packet timestamp
2812
if (kf < (tmp - 4096)) // workaround wrap-around problems
2814
else if (kf > (tmp + 4096))
2816
kf += track->rv_kf_base;
2818
if (pict_type != 3) { // P || I frame -> swap timestamps
2820
kf = track->rv_kf_pts;
2821
track->rv_kf_pts = tmp;
2823
mp_msg(MSGT_DEMUX, MSGL_DBG2, "\nTS: %08X -> %08X (%04X) %d %02X %02X %02X "
2824
"%02X %5d\n", timestamp, kf, orig_kf, pict_type, s[0], s[1], s[2],
2825
s[3], kf - (int)(1000.0 * track->rv_pts));
2827
v_pts = kf * 0.001f;
2828
track->rv_pts = v_pts;
2383
double real_fix_timestamp(unsigned char *buf, unsigned int timestamp, unsigned int format, int64_t *kf_base, int *kf_pts, double *pts);
2834
2386
handle_realvideo (demuxer_t *demuxer, mkv_track_t *track, uint8_t *buffer,
2837
2389
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2838
2390
demux_packet_t *dp;
2839
2391
uint32_t timestamp = mkv_d->last_pts * 1000;
2843
#ifdef WORDS_BIGENDIAN
2849
isize = --size - (chunks+1)*8;
2850
dp = new_demux_packet (REALHEADER_SIZE + size);
2851
memcpy (dp->buffer + REALHEADER_SIZE, buffer + (chunks+1)*8, isize);
2852
#ifdef WORDS_BIGENDIAN
2853
p = (uint8_t *)(dp->buffer + REALHEADER_SIZE + isize);
2854
for (i = 0; i<(chunks+1)*8; i+=4) {
2855
p[i] = *((uint8_t *)buffer+i+3);
2856
p[i+1] = *((uint8_t *)buffer+i+2);
2857
p[i+2] = *((uint8_t *)buffer+i+1);
2858
p[i+3] = *((uint8_t *)buffer+i);
2861
memcpy (dp->buffer + REALHEADER_SIZE + isize, buffer, (chunks+1)*8);
2865
*hdr++ = chunks; // number of chunks
2866
*hdr++ = timestamp; // timestamp from packet header
2867
*hdr++ = isize; // length of actual data
2868
*hdr++ = REALHEADER_SIZE + isize; // offset to chunk offset array
2393
dp = new_demux_packet (size);
2394
memcpy (dp->buffer, buffer, size);
2870
2396
if (mkv_d->v_skip_to_keyframe)
3388
2915
demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags)
3390
2917
free_cached_dps (demuxer);
3391
if (!(flags & 2)) /* time in secs */
2918
if (!(flags & SEEK_FACTOR)) /* time in secs */
3393
2920
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
3394
2921
stream_t *s = demuxer->stream;
3395
2922
int64_t target_timecode = 0, diff, min_diff=0xFFFFFFFFFFFFFFFLL;
3398
if (!(flags & 1)) /* relative seek */
2925
if (!(flags & SEEK_ABSOLUTE)) /* relative seek */
3399
2926
target_timecode = (int64_t) (mkv_d->last_pts * 1000.0);
3400
2927
target_timecode += (int64_t)(rel_seek_secs * 1000.0);
3401
2928
if (target_timecode < 0)
3597
/** \brief Get the language code for a subtitle track.
3599
Retrieves the language code for a subtitle track if it is known.
3600
If the language code is "und" then do not copy it ("und" = "undefined").
3602
\param demuxer The demuxer to work on
3603
\param track_num The subtitle track number to get the language from
3604
\param lang Store the language here
3605
\param maxlen The maximum number of characters to copy into lang
3608
demux_mkv_get_sub_lang(demuxer_t *demuxer, int track_num, char *lang,
3611
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
3612
mkv_track_t *track = demux_mkv_find_track_by_num (mkv_d, track_num, MATROSKA_TRACK_SUBTITLE);
3613
if (track && track->language && strcmp(track->language, "und"))
3614
av_strlcpy(lang, track->language, maxlen);
3617
/** \brief Get the language code for an audio track.
3619
Retrieves the language code for an audio track if it is known.
3620
If the language code is "und" then do not copy it ("und" = "undefined").
3622
\param demuxer The demuxer to work on
3623
\param track_num The n'th audio track to get the language from
3624
\param lang Store the language here
3625
\param maxlen The maximum number of characters to copy into lang
3628
demux_mkv_get_audio_lang(demuxer_t *demuxer, int track_num, char *lang,
3631
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
3632
mkv_track_t *track = demux_mkv_find_track_by_num (mkv_d, track_num, MATROSKA_TRACK_AUDIO);
3633
if (track && track->language && strcmp(track->language, "und"))
3634
av_strlcpy(lang, track->language, maxlen);
3638
demuxer_desc_t demuxer_desc_matroska = {
3126
const demuxer_desc_t demuxer_desc_matroska = {
3639
3127
"Matroska demuxer",