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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
1
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
2 #include "config.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16877
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
5
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
6 #include <stdlib.h>
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
9 #include "demuxer.h"
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
10 #include "stheader.h"
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
11 #include "genres.h"
6763
e29f95ed5d36 Fix vbr muxing and win32 codec crash on init
albeu
parents: 5812
diff changeset
12 #include "mp3_hdr.h"
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
13
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
14 #include <string.h>
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
15 #ifdef MP_DEBUG
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
16 #include <assert.h>
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
17 #endif
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
18
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
19 #define MP3 1
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
20 #define WAV 2
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 10891
diff changeset
21 #define fLaC 3
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
22
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
23
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
24 #define HDR_SIZE 4
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
25
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
26 typedef struct da_priv {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
29 } da_priv_t;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
54aef84a6b50 doxify a comment
reimar
parents: 21650
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
51
7867
3dc0b71630ff cleanup config option handling in libmpdemux.
arpi
parents: 7847
diff changeset
52 int hr_mp3_seek = 0;
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
280 static int demux_audio_open(demuxer_t* demuxer) {
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
281 stream_t *s;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
282 sh_audio_t* sh_audio;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
288 da_priv_t* priv;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
289 #ifdef MP_DEBUG
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
290 assert(demuxer != NULL);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
291 assert(demuxer->stream != NULL);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
292 #endif
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
293
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
294 s = demuxer->stream;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
300 step = 1;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
301
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
302 if( hdr[0] == 'R' && hdr[1] == 'I' && hdr[2] == 'F' && hdr[3] == 'F' ) {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
303 stream_skip(s,4);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
304 if(s->eof)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
305 break;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
306 stream_read(s,hdr,4);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
307 if(s->eof)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
308 break;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
309 if(hdr[0] != 'W' || hdr[1] != 'A' || hdr[2] != 'V' || hdr[3] != 'E' )
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
310 stream_skip(s,-8);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
311 else
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
312 // We found wav header. Now we can have 'fmt ' or a mp3 header
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
313 // empty the buffer
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
314 step = 4;
8116
3757669b825b skip id3v2 junk when looking for mp3
rfelker
parents: 8110
diff changeset
315 } else if( hdr[0] == 'I' && hdr[1] == 'D' && hdr[2] == '3' && (hdr[3] >= 2)) {
3757669b825b skip id3v2 junk when looking for mp3
rfelker
parents: 8110
diff changeset
316 int len;
3757669b825b skip id3v2 junk when looking for mp3
rfelker
parents: 8110
diff changeset
317 stream_skip(s,2);
3757669b825b skip id3v2 junk when looking for mp3
rfelker
parents: 8110
diff changeset
318 stream_read(s,hdr,4);
3757669b825b skip id3v2 junk when looking for mp3
rfelker
parents: 8110
diff changeset
319 len = (hdr[0]<<21) | (hdr[1]<<14) | (hdr[2]<<7) | hdr[3];
3757669b825b skip id3v2 junk when looking for mp3
rfelker
parents: 8110
diff changeset
320 stream_skip(s,len);
3757669b825b skip id3v2 junk when looking for mp3
rfelker
parents: 8110
diff changeset
321 step = 4;
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
322 } else if( hdr[0] == 'f' && hdr[1] == 'm' && hdr[2] == 't' && hdr[3] == ' ' ) {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
323 frmt = WAV;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 10891
diff changeset
333 } else if( hdr[0] == 'f' && hdr[1] == 'L' && hdr[2] == 'a' && hdr[3] == 'C' ) {
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 10891
diff changeset
334 frmt = fLaC;
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 10891
diff changeset
335 break;
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
336 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
337 // Add here some other audio format detection
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
338 if(step < HDR_SIZE)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
342 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
346 if(!frmt)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
347 return 0;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
348
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
349 sh_audio = new_sh_audio(demuxer,0);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
350
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
351 switch(frmt) {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
e29f95ed5d36 Fix vbr muxing and win32 codec crash on init
albeu
parents: 5812
diff changeset
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
e29f95ed5d36 Fix vbr muxing and win32 codec crash on init
albeu
parents: 5812
diff changeset
359 sh_audio->wf = malloc(sizeof(WAVEFORMATEX));
e29f95ed5d36 Fix vbr muxing and win32 codec crash on init
albeu
parents: 5812
diff changeset
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
e29f95ed5d36 Fix vbr muxing and win32 codec crash on init
albeu
parents: 5812
diff changeset
365 sh_audio->wf->wBitsPerSample = 16;
e29f95ed5d36 Fix vbr muxing and win32 codec crash on init
albeu
parents: 5812
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
370 if(s->end_pos) {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
371 char tag[4];
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
372 stream_seek(s,s->end_pos-128);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
373 stream_read(s,tag,3);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
374 tag[3] = '\0';
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
375 if(strcmp(tag,"TAG"))
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
376 demuxer->movi_end = s->end_pos;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
377 else {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
378 char buf[31];
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
379 uint8_t g;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
380 demuxer->movi_end = stream_tell(s)-3;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
381 stream_read(s,buf,30);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
382 buf[30] = '\0';
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
383 demux_info_add(demuxer,"Title",buf);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
384 stream_read(s,buf,30);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
385 buf[30] = '\0';
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
386 demux_info_add(demuxer,"Artist",buf);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
387 stream_read(s,buf,30);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
388 buf[30] = '\0';
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
389 demux_info_add(demuxer,"Album",buf);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
392 demux_info_add(demuxer,"Year",buf);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
393 stream_read(s,buf,30);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
394 buf[30] = '\0';
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
395 demux_info_add(demuxer,"Comment",buf);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
396 if(buf[28] == 0 && buf[29] != 0) {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
397 uint8_t trk = (uint8_t)buf[29];
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
398 sprintf(buf,"%d",trk);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
399 demux_info_add(demuxer,"Track",buf);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
400 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
401 g = stream_read_char(s);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
402 demux_info_add(demuxer,"Genre",genres[g]);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
403 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
404 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
405 break;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
409 WAVEFORMATEX* w;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
410 int l;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
411 l = stream_read_dword_le(s);
9596
7b4a17c415fb Same behaviour as old code for short headers
rtognimp
parents: 9591
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
421 w->wFormatTag = sh_audio->format = stream_read_word_le(s);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
422 w->nChannels = sh_audio->channels = stream_read_word_le(s);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
423 w->nSamplesPerSec = sh_audio->samplerate = stream_read_dword_le(s);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
424 w->nAvgBytesPerSec = stream_read_dword_le(s);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
7b4a17c415fb Same behaviour as old code for short headers
rtognimp
parents: 9591
diff changeset
430 l -= 16;
7b4a17c415fb Same behaviour as old code for short headers
rtognimp
parents: 9591
diff changeset
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
7b4a17c415fb Same behaviour as old code for short headers
rtognimp
parents: 9591
diff changeset
433 l -= 2;
9655
8809e2be5cea Warning fix, patch by Dominik Mierzejewsky
rtognimp
parents: 9616
diff changeset
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
8809e2be5cea Warning fix, patch by Dominik Mierzejewsky
rtognimp
parents: 9616
diff changeset
444 }
9596
7b4a17c415fb Same behaviour as old code for short headers
rtognimp
parents: 9591
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
448 if(l)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
93589138bb33 Check for eof in loop searching for data chunk.
reimar
parents: 22419
diff changeset
456 } while (!s->eof && chunk_type != mmioFOURCC('d', 'a', 't', 'a'));
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
f1e6a68a42f1 dump wav header
arpi
parents: 6763
diff changeset
459 // printf("wav: %X .. %X\n",(int)demuxer->movi_start,(int)demuxer->movi_end);
13006
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
460 // Check if it contains dts audio
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
461 if((w->wFormatTag == 0x01) && (w->nChannels == 2) && (w->nSamplesPerSec == 44100)) {
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
462 unsigned char buf[16384]; // vlc uses 16384*4 (4 dts frames)
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
463 unsigned int i;
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
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
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
466 // DTS, 14 bit, LE
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
467 if((buf[i] == 0xff) && (buf[i+1] == 0x1f) && (buf[i+2] == 0x00) &&
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
468 (buf[i+3] == 0xe8) && ((buf[i+4] & 0xfe) == 0xf0) && (buf[i+5] == 0x07)) {
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
469 sh_audio->format = 0x2001;
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
470 mp_msg(MSGT_DEMUX,MSGL_V,"[demux_audio] DTS audio in wav, 14 bit, LE\n");
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
471 break;
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
472 }
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
473 // DTS, 14 bit, BE
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
474 if((buf[i] == 0x1f) && (buf[i+1] == 0xff) && (buf[i+2] == 0xe8) &&
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
475 (buf[i+3] == 0x00) && (buf[i+4] == 0x07) && ((buf[i+5] & 0xfe) == 0xf0)) {
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
476 sh_audio->format = 0x2001;
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
477 mp_msg(MSGT_DEMUX,MSGL_V,"[demux_audio] DTS audio in wav, 14 bit, BE\n");
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
478 break;
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
479 }
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
480 // DTS, 16 bit, BE
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
481 if((buf[i] == 0x7f) && (buf[i+1] == 0xfe) && (buf[i+2] == 0x80) &&
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
482 (buf[i+3] == 0x01)) {
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
483 sh_audio->format = 0x2001;
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
484 mp_msg(MSGT_DEMUX,MSGL_V,"[demux_audio] DTS audio in wav, 16 bit, BE\n");
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
485 break;
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
486 }
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
487 // DTS, 16 bit, LE
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
488 if((buf[i] == 0xfe) && (buf[i+1] == 0x7f) && (buf[i+2] == 0x01) &&
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
489 (buf[i+3] == 0x80)) {
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
490 sh_audio->format = 0x2001;
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
491 mp_msg(MSGT_DEMUX,MSGL_V,"[demux_audio] DTS audio in wav, 16 bit, LE\n");
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
492 break;
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
493 }
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
494 }
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
495 if (sh_audio->format == 0x2001)
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
496 mp_msg(MSGT_DEMUX,MSGL_DBG2,"[demux_audio] DTS sync offset = %u\n", i);
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
497
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
498 }
8639d064d3a1 DTS support via lavc and libdts
rtognimp
parents: 12213
diff changeset
499 stream_seek(s,demuxer->movi_start);
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
500 } break;
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 10891
diff changeset
501 case fLaC:
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 10891
diff changeset
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
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 10891
diff changeset
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
0b13bab3f237 Use ULL for > 32 bits constant.
reimar
parents: 18075
diff changeset
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
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 10891
diff changeset
521 break;
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
522 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
527 demuxer->priv = priv;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
528 demuxer->audio->id = 0;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
529 demuxer->audio->sh = sh_audio;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
532
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
9262f4dc332f mp3 position fixed
arpi
parents: 4700
diff changeset
550
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
551 return DEMUXER_TYPE_AUDIO;
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
552 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
553
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
554
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
558 sh_audio_t* sh_audio;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
559 demuxer_t* demux;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
560 da_priv_t* priv;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
561 stream_t* s;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
562 #ifdef MP_DEBUG
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
563 assert(ds != NULL);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
564 assert(ds->sh != NULL);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
565 assert(ds->demuxer != NULL);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
566 #endif
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
567 sh_audio = ds->sh;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
568 demux = ds->demuxer;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
569 priv = demux->priv;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
570 s = demux->stream;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
571
16438
871e94131840 Ignore movi_end (except on error) to allow playing growing files.
reimar
parents: 16346
diff changeset
572 if(s->eof)
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
573 return 0;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
574
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
575 switch(priv->frmt) {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
578 uint8_t hdr[4];
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
586 stream_skip(s,-3);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
597 }
4700
30131db5dfbb Improved mp3 detection (don't detect mpeg1/2 as mp3 anymore)
albeu
parents: 4694
diff changeset
598 } break;
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
599 case WAV : {
17554
7084d2fbfea4 read data in nBlockAlign aligned chunks
reimar
parents: 17012
diff changeset
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
7084d2fbfea4 read data in nBlockAlign aligned chunks
reimar
parents: 17012
diff changeset
607 if (align)
7084d2fbfea4 read data in nBlockAlign aligned chunks
reimar
parents: 17012
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
613 }
11004
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 10891
diff changeset
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
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 10891
diff changeset
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
d48eccbbb984 FLAC decoding support via imported libmpflac.
lumag
parents: 10891
diff changeset
620 }
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
624 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
630 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17554
diff changeset
652 static void demux_audio_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
653 sh_audio_t* sh_audio;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
654 stream_t* s;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
655 int base,pos;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
656 float len;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
657 da_priv_t* priv;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
661 s = demuxer->stream;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
662 priv = demuxer->priv;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
7a4b18b787c0 Fix % seeking
albeu
parents: 4764
diff changeset
676 base = flags&1 ? demuxer->movi_start : stream_tell(s);
7a4b18b787c0 Fix % seeking
albeu
parents: 4764
diff changeset
677 if(flags&2)
7a4b18b787c0 Fix % seeking
albeu
parents: 4764
diff changeset
678 pos = base + ((demuxer->movi_end - demuxer->movi_start)*rel_seek_secs);
7a4b18b787c0 Fix % seeking
albeu
parents: 4764
diff changeset
679 else
7a4b18b787c0 Fix % seeking
albeu
parents: 4764
diff changeset
680 pos = base + (rel_seek_secs*sh_audio->i_bps);
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
681
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
682 if(demuxer->movi_end && pos >= demuxer->movi_end) {
8359
a93461f7e5ef fixed mp3 seeking near end of file
arpi
parents: 8123
diff changeset
683 pos = demuxer->movi_end;
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
684 } else if(pos < demuxer->movi_start)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
688
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
689 switch(priv->frmt) {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
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
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
696 break;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
697 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
698
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
699 stream_seek(s,pos);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents:
diff changeset
700 }
4764
9579496a91db Added pts for mp3 and wav. And perfect seeking for mp3, unless flags & 2
albeu
parents: 4720
diff changeset
701
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
702 static void demux_close_audio(demuxer_t* demuxer) {
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 5796
diff changeset
703 da_priv_t* priv = demuxer->priv;
f9d23c2aa6b7 Uninit added
albeu
parents: 5796
diff changeset
704
f9d23c2aa6b7 Uninit added
albeu
parents: 5796
diff changeset
705 if(!priv)
f9d23c2aa6b7 Uninit added
albeu
parents: 5796
diff changeset
706 return;
f9d23c2aa6b7 Uninit added
albeu
parents: 5796
diff changeset
707 free(priv);
f9d23c2aa6b7 Uninit added
albeu
parents: 5796
diff changeset
708 }
f9d23c2aa6b7 Uninit added
albeu
parents: 5796
diff changeset
709
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
731
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
732
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
733 demuxer_desc_t demuxer_desc_audio = {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
734 "Audio demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
735 "audio",
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
736 "Audio file",
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
737 "?",
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
738 "Audio only files",
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
739 DEMUXER_TYPE_AUDIO,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
740 0, // unsafe autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
741 demux_audio_open,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
742 demux_audio_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
743 NULL,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
744 demux_close_audio,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
745 demux_audio_seek,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
746 demux_audio_control
6b86089c2edd Demuxer modularization
rtognimp
parents: 16162
diff changeset
747 };