Mercurial > mplayer.hg
annotate libmpdemux/demux_audio.c @ 23510:a6c619ee9d30
Teletext support for tv:// (v4l and v4l2 only)
modified patch from Otvos Attila oattila at chello dot hu
Module uses zvbi library for all low-level VBI operations (like I/O with vbi
device, converting vbi pages into usefull vbi_page stuctures, rendering them
into RGB32 images).
All teletext related stuff (except properties, slave commands and rendering
osd in text mode or RGB32 rendered teletext pages in spu mode) is implemented
in tvi_vbi.c
New properties:
teletext_page - switching between pages
teletext_mode - switch between on/off/opaque/transparent modes
teletext_format - (currently read-only) allows to get format info
(black/white,gray,text)
teletext_half_page - trivial zooming (displaying top/bottom half of teletext
page)
New slave commands:
teletext_add_dec - user interface for jumping to any page by editing page number
interactively
teletext_go_link - goes though links, specified on current page
author | voroshil |
---|---|
date | Sun, 10 Jun 2007 00:06:12 +0000 |
parents | 4d81dbdf46b9 |
children | 980d734e102b |
rev | line source |
---|---|
4694 | 1 |
2 #include "config.h" | |
17012 | 3 #include "mp_msg.h" |
18176
f72bc5754209
Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents:
18117
diff
changeset
|
4 #include "help_mp.h" |
4694 | 5 |
6 #include <stdlib.h> | |
7 #include <stdio.h> | |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
22586
diff
changeset
|
8 #include "stream/stream.h" |
4694 | 9 #include "demuxer.h" |
10 #include "stheader.h" | |
11 #include "genres.h" | |
6763 | 12 #include "mp3_hdr.h" |
4694 | 13 |
14 #include <string.h> | |
15 #ifdef MP_DEBUG | |
16 #include <assert.h> | |
17 #endif | |
18 | |
19 #define MP3 1 | |
20 #define WAV 2 | |
11004 | 21 #define fLaC 3 |
4694 | 22 |
23 | |
24 #define HDR_SIZE 4 | |
25 | |
26 typedef struct da_priv { | |
27 int frmt; | |
4764
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
28 float last_pts; |
4694 | 29 } da_priv_t; |
30 | |
18074
a491d7628cdc
check wav header length against upper limit, should protect against
reimar
parents:
17977
diff
changeset
|
31 //! rather arbitrary value for maximum length of wav-format headers |
a491d7628cdc
check wav header length against upper limit, should protect against
reimar
parents:
17977
diff
changeset
|
32 #define MAX_WAVHDR_LEN (1 * 1024 * 1024) |
a491d7628cdc
check wav header length against upper limit, should protect against
reimar
parents:
17977
diff
changeset
|
33 |
21651 | 34 //! how many valid frames in a row we need before accepting as valid MP3 |
21650
0463916369ed
Require 12 consecutive MPEG-audio headers before detecting as audio.
reimar
parents:
20334
diff
changeset
|
35 #define MIN_MP3_HDRS 12 |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
36 |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
37 //! Used to describe a potential (chain of) MP3 headers we found |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
38 typedef struct mp3_hdr { |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
39 off_t frame_pos; // start of first frame in this "chain" of headers |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
40 off_t next_frame_pos; // here we expect the next header with same parameters |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
41 int mp3_chans; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
42 int mp3_freq; |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
43 int mpa_spf; |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
44 int mpa_layer; |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
45 int mpa_br; |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
46 int cons_hdrs; // if this reaches MIN_MP3_HDRS we accept as MP3 file |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
47 struct mp3_hdr *next; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
48 } mp3_hdr_t; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
49 |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
50 extern void print_wave_header(WAVEFORMATEX *h, int verbose_level); |
4694 | 51 |
7867 | 52 int hr_mp3_seek = 0; |
4694 | 53 |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
54 /** |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
55 * \brief free a list of MP3 header descriptions |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
56 * \param list pointer to the head-of-list pointer |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
57 */ |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
58 static void free_mp3_hdrs(mp3_hdr_t **list) { |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
59 mp3_hdr_t *tmp; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
60 while (*list) { |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
61 tmp = (*list)->next; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
62 free(*list); |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
63 *list = tmp; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
64 } |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
65 } |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
66 |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
67 /** |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
68 * \brief add another potential MP3 header to our list |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
69 * If it fits into an existing chain this one is expanded otherwise |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
70 * a new one is created. |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
71 * All entries that expected a MP3 header before the current position |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
72 * are discarded. |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
73 * The list is expected to be and will be kept sorted by next_frame_pos |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
74 * and when those are equal by frame_pos. |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
75 * \param list pointer to the head-of-list pointer |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
76 * \param st_pos stream position where the described header starts |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
77 * \param mp3_chans number of channels as specified by the header (*) |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
78 * \param mp3_freq sampling frequency as specified by the header (*) |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
79 * \param mpa_spf frame size as specified by the header |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
80 * \param mpa_layer layer type ("version") as specified by the header (*) |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
81 * \param mpa_br bitrate as specified by the header |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
82 * \param mp3_flen length of the frame as specified by the header |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
83 * \return If non-null the current file is accepted as MP3 and the |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
84 * mp3_hdr struct describing the valid chain is returned. Must be |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
85 * freed independent of the list. |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
86 * |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
87 * parameters marked by (*) must be the same for all headers in the same chain |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
88 */ |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
89 static mp3_hdr_t *add_mp3_hdr(mp3_hdr_t **list, off_t st_pos, |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
90 int mp3_chans, int mp3_freq, int mpa_spf, |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
91 int mpa_layer, int mpa_br, int mp3_flen) { |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
92 mp3_hdr_t *tmp; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
93 int in_list = 0; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
94 while (*list && (*list)->next_frame_pos <= st_pos) { |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
95 if (((*list)->next_frame_pos < st_pos) || ((*list)->mp3_chans != mp3_chans) |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
96 || ((*list)->mp3_freq != mp3_freq) || ((*list)->mpa_layer != mpa_layer) ) { |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
97 // wasn't valid! |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
98 tmp = (*list)->next; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
99 free(*list); |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
100 *list = tmp; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
101 } else { |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
102 (*list)->cons_hdrs++; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
103 (*list)->next_frame_pos = st_pos + mp3_flen; |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
104 (*list)->mpa_spf = mpa_spf; |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
105 (*list)->mpa_br = mpa_br; |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
106 if ((*list)->cons_hdrs >= MIN_MP3_HDRS) { |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
107 // copy the valid entry, so that the list can be easily freed |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
108 tmp = malloc(sizeof(mp3_hdr_t)); |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
109 memcpy(tmp, *list, sizeof(mp3_hdr_t)); |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
110 tmp->next = NULL; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
111 return tmp; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
112 } |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
113 in_list = 1; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
114 list = &((*list)->next); |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
115 } |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
116 } |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
117 if (!in_list) { // does not belong into an existing chain, insert |
15215
db6286839af7
Fix MP3 detection (list of found MP3 headers was not kep sorted).
reimar
parents:
15205
diff
changeset
|
118 // find right position to insert to keep sorting |
db6286839af7
Fix MP3 detection (list of found MP3 headers was not kep sorted).
reimar
parents:
15205
diff
changeset
|
119 while (*list && (*list)->next_frame_pos <= st_pos + mp3_flen) |
db6286839af7
Fix MP3 detection (list of found MP3 headers was not kep sorted).
reimar
parents:
15205
diff
changeset
|
120 list = &((*list)->next); |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
121 tmp = malloc(sizeof(mp3_hdr_t)); |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
122 tmp->frame_pos = st_pos; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
123 tmp->next_frame_pos = st_pos + mp3_flen; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
124 tmp->mp3_chans = mp3_chans; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
125 tmp->mp3_freq = mp3_freq; |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
126 tmp->mpa_spf = mpa_spf; |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
127 tmp->mpa_layer = mpa_layer; |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
128 tmp->mpa_br = mpa_br; |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
129 tmp->cons_hdrs = 1; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
130 tmp->next = *list; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
131 *list = tmp; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
132 } |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
133 return NULL; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
134 } |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
135 |
17898
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
136 #define FLAC_SIGNATURE_SIZE 4 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
137 #define FLAC_STREAMINFO_SIZE 34 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
138 #define FLAC_SEEKPOINT_SIZE 18 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
139 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
140 enum { |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
141 FLAC_STREAMINFO = 0, |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
142 FLAC_PADDING, |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
143 FLAC_APPLICATION, |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
144 FLAC_SEEKTABLE, |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
145 FLAC_VORBIS_COMMENT, |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
146 FLAC_CUESHEET |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
147 } flac_preamble_t; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
148 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
149 static void |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
150 get_flac_metadata (demuxer_t* demuxer) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
151 { |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
152 uint8_t preamble[4]; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
153 unsigned int blk_len; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
154 stream_t *s = NULL; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
155 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
156 if (!demuxer) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
157 return; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
158 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
159 s = demuxer->stream; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
160 if (!s) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
161 return; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
162 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
163 /* file is qualified; skip over the signature bytes in the stream */ |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
164 stream_seek (s, 4); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
165 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
166 /* loop through the metadata blocks; use a do-while construct since there |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
167 * will always be 1 metadata block */ |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
168 do { |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
169 int r; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
170 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
171 r = stream_read (s, (char *) preamble, FLAC_SIGNATURE_SIZE); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
172 if (r != FLAC_SIGNATURE_SIZE) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
173 return; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
174 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
175 blk_len = (preamble[1] << 16) | (preamble[2] << 8) | (preamble[3] << 0); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
176 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
177 switch (preamble[0] & 0x7F) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
178 { |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
179 case FLAC_STREAMINFO: |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
180 { |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
181 if (blk_len != FLAC_STREAMINFO_SIZE) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
182 return; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
183 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
184 stream_skip (s, FLAC_STREAMINFO_SIZE); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
185 break; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
186 } |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
187 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
188 case FLAC_PADDING: |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
189 stream_skip (s, blk_len); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
190 break; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
191 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
192 case FLAC_APPLICATION: |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
193 stream_skip (s, blk_len); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
194 break; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
195 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
196 case FLAC_SEEKTABLE: |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
197 { |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
198 int seekpoint_count, i; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
199 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
200 seekpoint_count = blk_len / FLAC_SEEKPOINT_SIZE; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
201 for (i = 0; i < seekpoint_count; i++) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
202 if (stream_skip (s, FLAC_SEEKPOINT_SIZE) != 1) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
203 return; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
204 break; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
205 } |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
206 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
207 case FLAC_VORBIS_COMMENT: |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
208 { |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
209 /* For a description of the format please have a look at */ |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
210 /* http://www.xiph.org/vorbis/doc/v-comment.html */ |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
211 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
212 uint32_t length, comment_list_len; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
213 char comments[blk_len]; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
214 void *ptr = comments; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
215 char *comment; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
216 int cn; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
217 char c; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
218 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
219 if (stream_read (s, comments, blk_len) == blk_len) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
220 { |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
221 uint8_t *p = ptr; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
222 length = p[0] + (p[1] << 8) + (p[2] << 16) + (p[3] << 24); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
223 ptr += 4 + length; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
224 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
225 p = ptr; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
226 comment_list_len = p[0] + (p[1] << 8) + (p[2] << 16) + (p[3] << 24); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
227 ptr += 4; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
228 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
229 cn = 0; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
230 for (; cn < comment_list_len; cn++) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
231 { |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
232 p = ptr; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
233 length = p[0] + (p[1] << 8) + (p[2] << 16) + (p[3] << 24); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
234 ptr += 4; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
235 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
236 comment = (char *) ptr; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
237 c = comment[length]; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
238 comment[length] = 0; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
239 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
240 if (!strncasecmp ("TITLE=", comment, 6) && (length - 6 > 0)) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
241 demux_info_add (demuxer, "Title", comment + 6); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
242 else if (!strncasecmp ("ARTIST=", comment, 7) && (length - 7 > 0)) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
243 demux_info_add (demuxer, "Artist", comment + 7); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
244 else if (!strncasecmp ("ALBUM=", comment, 6) && (length - 6 > 0)) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
245 demux_info_add (demuxer, "Album", comment + 6); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
246 else if (!strncasecmp ("DATE=", comment, 5) && (length - 5 > 0)) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
247 demux_info_add (demuxer, "Year", comment + 5); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
248 else if (!strncasecmp ("GENRE=", comment, 6) && (length - 6 > 0)) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
249 demux_info_add (demuxer, "Genre", comment + 6); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
250 else if (!strncasecmp ("Comment=", comment, 8) && (length - 8 > 0)) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
251 demux_info_add (demuxer, "Comment", comment + 8); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
252 else if (!strncasecmp ("TRACKNUMBER=", comment, 12) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
253 && (length - 12 > 0)) |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
254 { |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
255 char buf[31]; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
256 buf[30] = '\0'; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
257 sprintf (buf, "%d", atoi (comment + 12)); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
258 demux_info_add(demuxer, "Track", buf); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
259 } |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
260 comment[length] = c; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
261 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
262 ptr += length; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
263 } |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
264 } |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
265 break; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
266 } |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
267 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
268 case FLAC_CUESHEET: |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
269 stream_skip (s, blk_len); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
270 break; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
271 |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
272 default: |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
273 /* 6-127 are presently reserved */ |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
274 stream_skip (s, blk_len); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
275 break; |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
276 } |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
277 } while ((preamble[0] & 0x80) == 0); |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
278 } |
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
279 |
16175 | 280 static int demux_audio_open(demuxer_t* demuxer) { |
4694 | 281 stream_t *s; |
282 sh_audio_t* sh_audio; | |
283 uint8_t hdr[HDR_SIZE]; | |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
284 int frmt = 0, n = 0, step; |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
285 off_t st_pos = 0, next_frame_pos = 0; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
286 // mp3_hdrs list is sorted first by next_frame_pos and then by frame_pos |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
287 mp3_hdr_t *mp3_hdrs = NULL, *mp3_found = NULL; |
4694 | 288 da_priv_t* priv; |
289 #ifdef MP_DEBUG | |
290 assert(demuxer != NULL); | |
291 assert(demuxer->stream != NULL); | |
292 #endif | |
293 | |
294 s = demuxer->stream; | |
295 | |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
296 stream_read(s, hdr, HDR_SIZE); |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
297 while(n < 30000 && !s->eof) { |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
298 int mp3_freq, mp3_chans, mp3_flen, mpa_layer, mpa_spf, mpa_br; |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
299 st_pos = stream_tell(s) - HDR_SIZE; |
4694 | 300 step = 1; |
301 | |
302 if( hdr[0] == 'R' && hdr[1] == 'I' && hdr[2] == 'F' && hdr[3] == 'F' ) { | |
303 stream_skip(s,4); | |
304 if(s->eof) | |
305 break; | |
306 stream_read(s,hdr,4); | |
307 if(s->eof) | |
308 break; | |
309 if(hdr[0] != 'W' || hdr[1] != 'A' || hdr[2] != 'V' || hdr[3] != 'E' ) | |
310 stream_skip(s,-8); | |
311 else | |
312 // We found wav header. Now we can have 'fmt ' or a mp3 header | |
313 // empty the buffer | |
314 step = 4; | |
8116 | 315 } else if( hdr[0] == 'I' && hdr[1] == 'D' && hdr[2] == '3' && (hdr[3] >= 2)) { |
316 int len; | |
317 stream_skip(s,2); | |
318 stream_read(s,hdr,4); | |
319 len = (hdr[0]<<21) | (hdr[1]<<14) | (hdr[2]<<7) | hdr[3]; | |
320 stream_skip(s,len); | |
321 step = 4; | |
4694 | 322 } else if( hdr[0] == 'f' && hdr[1] == 'm' && hdr[2] == 't' && hdr[3] == ' ' ) { |
323 frmt = WAV; | |
324 break; | |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
325 } else if((mp3_flen = mp_get_mp3_header(hdr, &mp3_chans, &mp3_freq, |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
326 &mpa_spf, &mpa_layer, &mpa_br)) > 0) { |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
327 mp3_found = add_mp3_hdr(&mp3_hdrs, st_pos, mp3_chans, mp3_freq, |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
328 mpa_spf, mpa_layer, mpa_br, mp3_flen); |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
329 if (mp3_found) { |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
330 frmt = MP3; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
331 break; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
332 } |
11004 | 333 } else if( hdr[0] == 'f' && hdr[1] == 'L' && hdr[2] == 'a' && hdr[3] == 'C' ) { |
334 frmt = fLaC; | |
335 break; | |
4694 | 336 } |
337 // Add here some other audio format detection | |
338 if(step < HDR_SIZE) | |
339 memmove(hdr,&hdr[step],HDR_SIZE-step); | |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
340 stream_read(s, &hdr[HDR_SIZE - step], step); |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
341 n++; |
4694 | 342 } |
343 | |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
344 free_mp3_hdrs(&mp3_hdrs); |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
345 |
4694 | 346 if(!frmt) |
347 return 0; | |
348 | |
349 sh_audio = new_sh_audio(demuxer,0); | |
350 | |
351 switch(frmt) { | |
352 case MP3: | |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
353 sh_audio->format = (mp3_found->mpa_layer < 3 ? 0x50 : 0x55); |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
354 demuxer->movi_start = mp3_found->frame_pos; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
355 next_frame_pos = mp3_found->next_frame_pos; |
6763 | 356 sh_audio->audio.dwSampleSize= 0; |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
357 sh_audio->audio.dwScale = mp3_found->mpa_spf; |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
358 sh_audio->audio.dwRate = mp3_found->mp3_freq; |
6763 | 359 sh_audio->wf = malloc(sizeof(WAVEFORMATEX)); |
360 sh_audio->wf->wFormatTag = sh_audio->format; | |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
361 sh_audio->wf->nChannels = mp3_found->mp3_chans; |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
362 sh_audio->wf->nSamplesPerSec = mp3_found->mp3_freq; |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
363 sh_audio->wf->nAvgBytesPerSec = mp3_found->mpa_br * (1000 / 8); |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
364 sh_audio->wf->nBlockAlign = mp3_found->mpa_spf; |
6763 | 365 sh_audio->wf->wBitsPerSample = 16; |
366 sh_audio->wf->cbSize = 0; | |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
367 sh_audio->i_bps = sh_audio->wf->nAvgBytesPerSec; |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
368 free(mp3_found); |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
369 mp3_found = NULL; |
4694 | 370 if(s->end_pos) { |
371 char tag[4]; | |
372 stream_seek(s,s->end_pos-128); | |
373 stream_read(s,tag,3); | |
374 tag[3] = '\0'; | |
375 if(strcmp(tag,"TAG")) | |
376 demuxer->movi_end = s->end_pos; | |
377 else { | |
378 char buf[31]; | |
379 uint8_t g; | |
380 demuxer->movi_end = stream_tell(s)-3; | |
381 stream_read(s,buf,30); | |
382 buf[30] = '\0'; | |
383 demux_info_add(demuxer,"Title",buf); | |
384 stream_read(s,buf,30); | |
385 buf[30] = '\0'; | |
386 demux_info_add(demuxer,"Artist",buf); | |
387 stream_read(s,buf,30); | |
388 buf[30] = '\0'; | |
389 demux_info_add(demuxer,"Album",buf); | |
390 stream_read(s,buf,4); | |
4764
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
391 buf[4] = '\0'; |
4694 | 392 demux_info_add(demuxer,"Year",buf); |
393 stream_read(s,buf,30); | |
394 buf[30] = '\0'; | |
395 demux_info_add(demuxer,"Comment",buf); | |
396 if(buf[28] == 0 && buf[29] != 0) { | |
397 uint8_t trk = (uint8_t)buf[29]; | |
398 sprintf(buf,"%d",trk); | |
399 demux_info_add(demuxer,"Track",buf); | |
400 } | |
401 g = stream_read_char(s); | |
402 demux_info_add(demuxer,"Genre",genres[g]); | |
403 } | |
404 } | |
405 break; | |
406 case WAV: { | |
4720
10ad330c1733
fixed WAV demuxer so that it skips to the actual start of the audio data
melanson
parents:
4717
diff
changeset
|
407 unsigned int chunk_type; |
10ad330c1733
fixed WAV demuxer so that it skips to the actual start of the audio data
melanson
parents:
4717
diff
changeset
|
408 unsigned int chunk_size; |
4694 | 409 WAVEFORMATEX* w; |
410 int l; | |
411 l = stream_read_dword_le(s); | |
9596 | 412 if(l < 16) { |
9591
3904b95fce8f
Read extradata for wav files, based on patch by <dimakar(at)yahoo.com>. Required for truespeech files.
rtognimp
parents:
8359
diff
changeset
|
413 mp_msg(MSGT_DEMUX,MSGL_ERR,"[demux_audio] Bad wav header length: too short (%d)!!!\n",l); |
20334
5fcc8a3b1e88
Try playing files with wrong wav header length, fixes riff_broken_hrdlen.wav
reimar
parents:
19062
diff
changeset
|
414 l = 16; |
4694 | 415 } |
18074
a491d7628cdc
check wav header length against upper limit, should protect against
reimar
parents:
17977
diff
changeset
|
416 if(l > MAX_WAVHDR_LEN) { |
a491d7628cdc
check wav header length against upper limit, should protect against
reimar
parents:
17977
diff
changeset
|
417 mp_msg(MSGT_DEMUX,MSGL_ERR,"[demux_audio] Bad wav header length: too long (%d)!!!\n",l); |
20334
5fcc8a3b1e88
Try playing files with wrong wav header length, fixes riff_broken_hrdlen.wav
reimar
parents:
19062
diff
changeset
|
418 l = 16; |
18074
a491d7628cdc
check wav header length against upper limit, should protect against
reimar
parents:
17977
diff
changeset
|
419 } |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18710
diff
changeset
|
420 sh_audio->wf = w = malloc(l > sizeof(WAVEFORMATEX) ? l : sizeof(WAVEFORMATEX)); |
4694 | 421 w->wFormatTag = sh_audio->format = stream_read_word_le(s); |
422 w->nChannels = sh_audio->channels = stream_read_word_le(s); | |
423 w->nSamplesPerSec = sh_audio->samplerate = stream_read_dword_le(s); | |
424 w->nAvgBytesPerSec = stream_read_dword_le(s); | |
425 w->nBlockAlign = stream_read_word_le(s); | |
22419
4cfb8def78c1
Fix wrong setting of samplesize (must be bytes per sample, not bits)
reimar
parents:
22103
diff
changeset
|
426 w->wBitsPerSample = stream_read_word_le(s); |
4cfb8def78c1
Fix wrong setting of samplesize (must be bytes per sample, not bits)
reimar
parents:
22103
diff
changeset
|
427 sh_audio->samplesize = (w->wBitsPerSample + 7) / 8; |
9616
a6bbab17a87f
10l cbSize not inited for l=16.\n Could give problem in print_wave_header
rtognimp
parents:
9596
diff
changeset
|
428 w->cbSize = 0; |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15215
diff
changeset
|
429 sh_audio->i_bps = sh_audio->wf->nAvgBytesPerSec; |
9596 | 430 l -= 16; |
431 if (l > 0) { | |
9591
3904b95fce8f
Read extradata for wav files, based on patch by <dimakar(at)yahoo.com>. Required for truespeech files.
rtognimp
parents:
8359
diff
changeset
|
432 w->cbSize = stream_read_word_le(s); |
9596 | 433 l -= 2; |
9655 | 434 if (w->cbSize > 0) { |
9591
3904b95fce8f
Read extradata for wav files, based on patch by <dimakar(at)yahoo.com>. Required for truespeech files.
rtognimp
parents:
8359
diff
changeset
|
435 if (l < w->cbSize) { |
3904b95fce8f
Read extradata for wav files, based on patch by <dimakar(at)yahoo.com>. Required for truespeech files.
rtognimp
parents:
8359
diff
changeset
|
436 mp_msg(MSGT_DEMUX,MSGL_ERR,"[demux_audio] truncated extradata (%d < %d)\n", |
3904b95fce8f
Read extradata for wav files, based on patch by <dimakar(at)yahoo.com>. Required for truespeech files.
rtognimp
parents:
8359
diff
changeset
|
437 l,w->cbSize); |
3904b95fce8f
Read extradata for wav files, based on patch by <dimakar(at)yahoo.com>. Required for truespeech files.
rtognimp
parents:
8359
diff
changeset
|
438 stream_read(s,(char*)((char*)(w)+sizeof(WAVEFORMATEX)),l); |
3904b95fce8f
Read extradata for wav files, based on patch by <dimakar(at)yahoo.com>. Required for truespeech files.
rtognimp
parents:
8359
diff
changeset
|
439 l = 0; |
3904b95fce8f
Read extradata for wav files, based on patch by <dimakar(at)yahoo.com>. Required for truespeech files.
rtognimp
parents:
8359
diff
changeset
|
440 } else { |
3904b95fce8f
Read extradata for wav files, based on patch by <dimakar(at)yahoo.com>. Required for truespeech files.
rtognimp
parents:
8359
diff
changeset
|
441 stream_read(s,(char*)((char*)(w)+sizeof(WAVEFORMATEX)),w->cbSize); |
3904b95fce8f
Read extradata for wav files, based on patch by <dimakar(at)yahoo.com>. Required for truespeech files.
rtognimp
parents:
8359
diff
changeset
|
442 l -= w->cbSize; |
3904b95fce8f
Read extradata for wav files, based on patch by <dimakar(at)yahoo.com>. Required for truespeech files.
rtognimp
parents:
8359
diff
changeset
|
443 } |
9655 | 444 } |
9596 | 445 } |
9591
3904b95fce8f
Read extradata for wav files, based on patch by <dimakar(at)yahoo.com>. Required for truespeech files.
rtognimp
parents:
8359
diff
changeset
|
446 |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
447 if( mp_msg_test(MSGT_DEMUX,MSGL_V) ) print_wave_header(w, MSGL_V); |
4694 | 448 if(l) |
449 stream_skip(s,l); | |
4720
10ad330c1733
fixed WAV demuxer so that it skips to the actual start of the audio data
melanson
parents:
4717
diff
changeset
|
450 do |
10ad330c1733
fixed WAV demuxer so that it skips to the actual start of the audio data
melanson
parents:
4717
diff
changeset
|
451 { |
10ad330c1733
fixed WAV demuxer so that it skips to the actual start of the audio data
melanson
parents:
4717
diff
changeset
|
452 chunk_type = stream_read_fourcc(demuxer->stream); |
10ad330c1733
fixed WAV demuxer so that it skips to the actual start of the audio data
melanson
parents:
4717
diff
changeset
|
453 chunk_size = stream_read_dword_le(demuxer->stream); |
10ad330c1733
fixed WAV demuxer so that it skips to the actual start of the audio data
melanson
parents:
4717
diff
changeset
|
454 if (chunk_type != mmioFOURCC('d', 'a', 't', 'a')) |
10ad330c1733
fixed WAV demuxer so that it skips to the actual start of the audio data
melanson
parents:
4717
diff
changeset
|
455 stream_skip(demuxer->stream, chunk_size); |
22586 | 456 } while (!s->eof && chunk_type != mmioFOURCC('d', 'a', 't', 'a')); |
4694 | 457 demuxer->movi_start = stream_tell(s); |
22103
0427f8190a12
Do not read beyond end of data chunk if chunk_size is set.
reimar
parents:
21651
diff
changeset
|
458 demuxer->movi_end = chunk_size ? demuxer->movi_start + chunk_size : s->end_pos; |
7847 | 459 // printf("wav: %X .. %X\n",(int)demuxer->movi_start,(int)demuxer->movi_end); |
13006 | 460 // Check if it contains dts audio |
461 if((w->wFormatTag == 0x01) && (w->nChannels == 2) && (w->nSamplesPerSec == 44100)) { | |
462 unsigned char buf[16384]; // vlc uses 16384*4 (4 dts frames) | |
463 unsigned int i; | |
464 stream_read(s, buf, sizeof(buf)); | |
17775
28c2108f1cfa
"i < sizeof(buf)" must be "i < sizeof(buf) - 5", since later buf[i + 5] is used.
reimar
parents:
17636
diff
changeset
|
465 for (i = 0; i < sizeof(buf) - 5; i += 2) { |
13006 | 466 // DTS, 14 bit, LE |
467 if((buf[i] == 0xff) && (buf[i+1] == 0x1f) && (buf[i+2] == 0x00) && | |
468 (buf[i+3] == 0xe8) && ((buf[i+4] & 0xfe) == 0xf0) && (buf[i+5] == 0x07)) { | |
469 sh_audio->format = 0x2001; | |
470 mp_msg(MSGT_DEMUX,MSGL_V,"[demux_audio] DTS audio in wav, 14 bit, LE\n"); | |
471 break; | |
472 } | |
473 // DTS, 14 bit, BE | |
474 if((buf[i] == 0x1f) && (buf[i+1] == 0xff) && (buf[i+2] == 0xe8) && | |
475 (buf[i+3] == 0x00) && (buf[i+4] == 0x07) && ((buf[i+5] & 0xfe) == 0xf0)) { | |
476 sh_audio->format = 0x2001; | |
477 mp_msg(MSGT_DEMUX,MSGL_V,"[demux_audio] DTS audio in wav, 14 bit, BE\n"); | |
478 break; | |
479 } | |
480 // DTS, 16 bit, BE | |
481 if((buf[i] == 0x7f) && (buf[i+1] == 0xfe) && (buf[i+2] == 0x80) && | |
482 (buf[i+3] == 0x01)) { | |
483 sh_audio->format = 0x2001; | |
484 mp_msg(MSGT_DEMUX,MSGL_V,"[demux_audio] DTS audio in wav, 16 bit, BE\n"); | |
485 break; | |
486 } | |
487 // DTS, 16 bit, LE | |
488 if((buf[i] == 0xfe) && (buf[i+1] == 0x7f) && (buf[i+2] == 0x01) && | |
489 (buf[i+3] == 0x80)) { | |
490 sh_audio->format = 0x2001; | |
491 mp_msg(MSGT_DEMUX,MSGL_V,"[demux_audio] DTS audio in wav, 16 bit, LE\n"); | |
492 break; | |
493 } | |
494 } | |
495 if (sh_audio->format == 0x2001) | |
496 mp_msg(MSGT_DEMUX,MSGL_DBG2,"[demux_audio] DTS sync offset = %u\n", i); | |
497 | |
498 } | |
499 stream_seek(s,demuxer->movi_start); | |
4694 | 500 } break; |
11004 | 501 case fLaC: |
502 sh_audio->format = mmioFOURCC('f', 'L', 'a', 'C'); | |
18075
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
503 demuxer->movi_start = stream_tell(s) - 4; |
11004 | 504 demuxer->movi_end = s->end_pos; |
18075
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
505 if (demuxer->movi_end > demuxer->movi_start) { |
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
506 // try to find out approx. bitrate |
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
507 int64_t size = demuxer->movi_end - demuxer->movi_start; |
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
508 int64_t num_samples = 0; |
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
509 int32_t srate = 0; |
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
510 stream_skip(s, 14); |
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
511 stream_read(s, (char *)&srate, 3); |
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
512 srate = be2me_32(srate) >> 12; |
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
513 stream_read(s, (char *)&num_samples, 5); |
18117 | 514 num_samples = (be2me_64(num_samples) >> 24) & 0xfffffffffULL; |
18075
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
515 if (num_samples && srate) |
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
516 sh_audio->i_bps = size * srate / num_samples; |
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
517 } |
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
518 if (sh_audio->i_bps < 1) // guess value to prevent crash |
2373ed2ee546
try to detect flac bitrate early on to avoid division by zero problems.
reimar
parents:
18074
diff
changeset
|
519 sh_audio->i_bps = 64 * 1024; |
17898
a2b85171b4de
retrieve metadata from FLAC files (patch by Benjamin Zores < ben _at_ geexbox.org >)
aurel
parents:
17790
diff
changeset
|
520 get_flac_metadata (demuxer); |
11004 | 521 break; |
4694 | 522 } |
523 | |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18710
diff
changeset
|
524 priv = malloc(sizeof(da_priv_t)); |
4694 | 525 priv->frmt = frmt; |
4764
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
526 priv->last_pts = -1; |
4694 | 527 demuxer->priv = priv; |
528 demuxer->audio->id = 0; | |
529 demuxer->audio->sh = sh_audio; | |
530 sh_audio->ds = demuxer->audio; | |
10244
a084597140af
don't set audio pts to infinity after seeking in mp3 files :)
rfelker
parents:
9655
diff
changeset
|
531 sh_audio->samplerate = sh_audio->audio.dwRate; |
4694 | 532 |
533 if(stream_tell(s) != demuxer->movi_start) | |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
534 { |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
535 mp_msg(MSGT_DEMUX, MSGL_V, "demux_audio: seeking from 0x%X to start pos 0x%X\n", |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
536 (int)stream_tell(s), (int)demuxer->movi_start); |
4694 | 537 stream_seek(s,demuxer->movi_start); |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
538 if (stream_tell(s) != demuxer->movi_start) { |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
539 mp_msg(MSGT_DEMUX, MSGL_V, "demux_audio: seeking failed, now at 0x%X!\n", |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
540 (int)stream_tell(s)); |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
541 if (next_frame_pos) { |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
542 mp_msg(MSGT_DEMUX, MSGL_V, "demux_audio: seeking to 0x%X instead\n", |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
543 (int)next_frame_pos); |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
544 stream_seek(s, next_frame_pos); |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
545 } |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
546 } |
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
547 } |
4694 | 548 |
13503
f8347c521898
better, tuneable (via #define) MP3 detection, limit demux_audio to scanning
reimar
parents:
13357
diff
changeset
|
549 mp_msg(MSGT_DEMUX,MSGL_V,"demux_audio: audio data 0x%X - 0x%X \n",(int)demuxer->movi_start,(int)demuxer->movi_end); |
4712 | 550 |
16175 | 551 return DEMUXER_TYPE_AUDIO; |
4694 | 552 } |
553 | |
554 | |
16175 | 555 static int demux_audio_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds) { |
14608
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
556 int l; |
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
557 demux_packet_t* dp; |
4694 | 558 sh_audio_t* sh_audio; |
559 demuxer_t* demux; | |
560 da_priv_t* priv; | |
561 stream_t* s; | |
562 #ifdef MP_DEBUG | |
563 assert(ds != NULL); | |
564 assert(ds->sh != NULL); | |
565 assert(ds->demuxer != NULL); | |
566 #endif | |
567 sh_audio = ds->sh; | |
568 demux = ds->demuxer; | |
569 priv = demux->priv; | |
570 s = demux->stream; | |
571 | |
16438
871e94131840
Ignore movi_end (except on error) to allow playing growing files.
reimar
parents:
16346
diff
changeset
|
572 if(s->eof) |
4694 | 573 return 0; |
574 | |
575 switch(priv->frmt) { | |
576 case MP3 : | |
14608
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
577 while(1) { |
4694 | 578 uint8_t hdr[4]; |
579 stream_read(s,hdr,4); | |
16438
871e94131840
Ignore movi_end (except on error) to allow playing growing files.
reimar
parents:
16346
diff
changeset
|
580 if (s->eof) |
14608
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
581 return 0; |
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
582 l = mp_decode_mp3_header(hdr); |
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
583 if(l < 0) { |
16438
871e94131840
Ignore movi_end (except on error) to allow playing growing files.
reimar
parents:
16346
diff
changeset
|
584 if (demux->movi_end && stream_tell(s) >= demux->movi_end) |
871e94131840
Ignore movi_end (except on error) to allow playing growing files.
reimar
parents:
16346
diff
changeset
|
585 return 0; // might be ID3 tag, i.e. EOF |
4694 | 586 stream_skip(s,-3); |
587 } else { | |
14608
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
588 dp = new_demux_packet(l); |
4694 | 589 memcpy(dp->buffer,hdr,4); |
16438
871e94131840
Ignore movi_end (except on error) to allow playing growing files.
reimar
parents:
16346
diff
changeset
|
590 if (stream_read(s,dp->buffer + 4,l-4) != l-4) |
17790
99a2481164ac
fix leak on read error (forgot to free demux packet)
reimar
parents:
17775
diff
changeset
|
591 { |
99a2481164ac
fix leak on read error (forgot to free demux packet)
reimar
parents:
17775
diff
changeset
|
592 free_demux_packet(dp); |
16438
871e94131840
Ignore movi_end (except on error) to allow playing growing files.
reimar
parents:
16346
diff
changeset
|
593 return 0; |
17790
99a2481164ac
fix leak on read error (forgot to free demux packet)
reimar
parents:
17775
diff
changeset
|
594 } |
15199
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
14910
diff
changeset
|
595 priv->last_pts = priv->last_pts < 0 ? 0 : priv->last_pts + sh_audio->audio.dwScale/(float)sh_audio->samplerate; |
14608
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
596 break; |
4694 | 597 } |
4700
30131db5dfbb
Improved mp3 detection (don't detect mpeg1/2 as mp3 anymore)
albeu
parents:
4694
diff
changeset
|
598 } break; |
4694 | 599 case WAV : { |
17554 | 600 unsigned align = sh_audio->wf->nBlockAlign; |
14608
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
601 l = sh_audio->wf->nAvgBytesPerSec; |
22103
0427f8190a12
Do not read beyond end of data chunk if chunk_size is set.
reimar
parents:
21651
diff
changeset
|
602 if (demux->movi_end && l > demux->movi_end - stream_tell(s)) { |
0427f8190a12
Do not read beyond end of data chunk if chunk_size is set.
reimar
parents:
21651
diff
changeset
|
603 // do not read beyond end, there might be junk after data chunk |
0427f8190a12
Do not read beyond end of data chunk if chunk_size is set.
reimar
parents:
21651
diff
changeset
|
604 l = demux->movi_end - stream_tell(s); |
0427f8190a12
Do not read beyond end of data chunk if chunk_size is set.
reimar
parents:
21651
diff
changeset
|
605 if (l <= 0) return 0; |
0427f8190a12
Do not read beyond end of data chunk if chunk_size is set.
reimar
parents:
21651
diff
changeset
|
606 } |
17554 | 607 if (align) |
608 l = (l + align - 1) / align * align; | |
14608
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
609 dp = new_demux_packet(l); |
10891
65ed62e138fa
Fixed 'reading after EOF'. demuxers didn't check, how many they've read!
lumag
parents:
10882
diff
changeset
|
610 l = stream_read(s,dp->buffer,l); |
14910
07be3bc42d47
100l to reimar.. sh_audio->samplerate and sh_audio->i_bps are not the same
rfelker
parents:
14608
diff
changeset
|
611 priv->last_pts = priv->last_pts < 0 ? 0 : priv->last_pts + l/(float)sh_audio->i_bps; |
14608
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
612 break; |
4694 | 613 } |
11004 | 614 case fLaC: { |
14608
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
615 l = 65535; |
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
616 dp = new_demux_packet(l); |
11004 | 617 l = stream_read(s,dp->buffer,l); |
14910
07be3bc42d47
100l to reimar.. sh_audio->samplerate and sh_audio->i_bps are not the same
rfelker
parents:
14608
diff
changeset
|
618 priv->last_pts = priv->last_pts < 0 ? 0 : priv->last_pts + l/(float)sh_audio->i_bps; |
14608
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
619 break; |
11004 | 620 } |
4694 | 621 default: |
18176
f72bc5754209
Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents:
18117
diff
changeset
|
622 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_MPDEMUX_AUDIO_UnknownFormat,priv->frmt); |
14608
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
623 return 0; |
4694 | 624 } |
625 | |
14608
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
626 resize_demux_packet(dp, l); |
18710
c528c6c518f1
Clean up audio pts handling, make audio pts tracking in the audio-only
uau
parents:
18708
diff
changeset
|
627 dp->pts = priv->last_pts; |
14608
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
628 ds_add_packet(ds, dp); |
9595f1de1393
Fix possible hang when playing broken MP3 from linear stream and remove
reimar
parents:
13503
diff
changeset
|
629 return 1; |
4694 | 630 } |
631 | |
4764
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
632 static void high_res_mp3_seek(demuxer_t *demuxer,float time) { |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
633 uint8_t hdr[4]; |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
634 int len,nf; |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
635 da_priv_t* priv = demuxer->priv; |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
636 sh_audio_t* sh = (sh_audio_t*)demuxer->audio->sh; |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
637 |
15199
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
14910
diff
changeset
|
638 nf = time*sh->samplerate/sh->audio.dwScale; |
4764
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
639 while(nf > 0) { |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
640 stream_read(demuxer->stream,hdr,4); |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
641 len = mp_decode_mp3_header(hdr); |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
642 if(len < 0) { |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
643 stream_skip(demuxer->stream,-3); |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
644 continue; |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
645 } |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
646 stream_skip(demuxer->stream,len-4); |
15199
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
14910
diff
changeset
|
647 priv->last_pts += sh->audio.dwScale/(float)sh->samplerate; |
4764
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
648 nf--; |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
649 } |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
650 } |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
651 |
17636 | 652 static void demux_audio_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ |
4694 | 653 sh_audio_t* sh_audio; |
654 stream_t* s; | |
655 int base,pos; | |
656 float len; | |
657 da_priv_t* priv; | |
658 | |
4764
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
659 if(!(sh_audio = demuxer->audio->sh)) |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
660 return; |
4694 | 661 s = demuxer->stream; |
662 priv = demuxer->priv; | |
663 | |
4764
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
664 if(priv->frmt == MP3 && hr_mp3_seek && !(flags & 2)) { |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
665 len = (flags & 1) ? rel_seek_secs - priv->last_pts : rel_seek_secs; |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
666 if(len < 0) { |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
667 stream_seek(s,demuxer->movi_start); |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
668 len = priv->last_pts + len; |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
669 priv->last_pts = 0; |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
670 } |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
671 if(len > 0) |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
672 high_res_mp3_seek(demuxer,len); |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
673 return; |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
674 } |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
675 |
5796 | 676 base = flags&1 ? demuxer->movi_start : stream_tell(s); |
677 if(flags&2) | |
678 pos = base + ((demuxer->movi_end - demuxer->movi_start)*rel_seek_secs); | |
679 else | |
680 pos = base + (rel_seek_secs*sh_audio->i_bps); | |
4694 | 681 |
682 if(demuxer->movi_end && pos >= demuxer->movi_end) { | |
8359 | 683 pos = demuxer->movi_end; |
4694 | 684 } else if(pos < demuxer->movi_start) |
685 pos = demuxer->movi_start; | |
4764
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
686 |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
687 priv->last_pts = (pos-demuxer->movi_start)/(float)sh_audio->i_bps; |
4694 | 688 |
689 switch(priv->frmt) { | |
690 case WAV: | |
16818
67ce689b5764
Fix seeking in wav files: align relative to start of data, not start of file
reimar
parents:
16438
diff
changeset
|
691 pos -= (pos - demuxer->movi_start) % |
67ce689b5764
Fix seeking in wav files: align relative to start of data, not start of file
reimar
parents:
16438
diff
changeset
|
692 (sh_audio->wf->nBlockAlign ? sh_audio->wf->nBlockAlign : |
67ce689b5764
Fix seeking in wav files: align relative to start of data, not start of file
reimar
parents:
16438
diff
changeset
|
693 (sh_audio->channels * sh_audio->samplesize)); |
4764
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
694 // We need to decrease the pts by one step to make it the "last one" |
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
695 priv->last_pts -= sh_audio->wf->nAvgBytesPerSec/(float)sh_audio->i_bps; |
4694 | 696 break; |
697 } | |
698 | |
699 stream_seek(s,pos); | |
700 } | |
4764
9579496a91db
Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents:
4720
diff
changeset
|
701 |
16175 | 702 static void demux_close_audio(demuxer_t* demuxer) { |
5812 | 703 da_priv_t* priv = demuxer->priv; |
704 | |
705 if(!priv) | |
706 return; | |
707 free(priv); | |
708 } | |
709 | |
16175 | 710 static int demux_audio_control(demuxer_t *demuxer,int cmd, void *arg){ |
10882
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
711 sh_audio_t *sh_audio=demuxer->audio->sh; |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
712 int audio_length = demuxer->movi_end / sh_audio->i_bps; |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
713 da_priv_t* priv = demuxer->priv; |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
714 |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
715 switch(cmd) { |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
716 case DEMUXER_CTRL_GET_TIME_LENGTH: |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
717 if (audio_length<=0) return DEMUXER_CTRL_DONTKNOW; |
16346
6ff303d2876b
Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents:
16175
diff
changeset
|
718 *((double *)arg)=(double)audio_length; |
10882
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
719 return DEMUXER_CTRL_GUESS; |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
720 |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
721 case DEMUXER_CTRL_GET_PERCENT_POS: |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
722 if (audio_length<=0) |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
723 return DEMUXER_CTRL_DONTKNOW; |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
724 *((int *)arg)=(int)( (priv->last_pts*100) / audio_length); |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
725 return DEMUXER_CTRL_OK; |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
726 |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
727 default: |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
728 return DEMUXER_CTRL_NOTIMPL; |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
729 } |
e46e5a6c53b8
get_percent_pos support in demux_audio, patch by ROSEN Jeremy <jeremy.rosen at c-s.fr>
faust3
parents:
10244
diff
changeset
|
730 } |
16175 | 731 |
732 | |
733 demuxer_desc_t demuxer_desc_audio = { | |
734 "Audio demuxer", | |
735 "audio", | |
736 "Audio file", | |
737 "?", | |
738 "Audio only files", | |
739 DEMUXER_TYPE_AUDIO, | |
740 0, // unsafe autodetect | |
741 demux_audio_open, | |
742 demux_audio_fill_buffer, | |
743 NULL, | |
744 demux_close_audio, | |
745 demux_audio_seek, | |
746 demux_audio_control | |
747 }; |