summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralbeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-02-14 13:04:35 +0000
committeralbeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-02-14 13:04:35 +0000
commit2462f728286867bd4928cf240db54d10f244f206 (patch)
tree7aa9aa83c35ca60ccd12df536084a2f2d488f38e
parentacab37105d07acf4067420b57a305ca2d65789d6 (diff)
downloadmpv-2462f728286867bd4928cf240db54d10f244f206.tar.bz2
mpv-2462f728286867bd4928cf240db54d10f244f206.tar.xz
Audio file demuxer. Extended version for demuxer info.
genres.h come from id3edit of servex@servex.yi.org found at http://id3edit.sourceforge.net/ git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4695 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--libmpdemux/Makefile2
-rw-r--r--libmpdemux/demux_audio.c249
-rw-r--r--libmpdemux/demuxer.c116
-rw-r--r--libmpdemux/demuxer.h3
-rw-r--r--libmpdemux/genres.h277
-rw-r--r--libmpdemux/mp3_hdr.c12
6 files changed, 581 insertions, 78 deletions
diff --git a/libmpdemux/Makefile b/libmpdemux/Makefile
index 3a05a31a02..af8d03c3c0 100644
--- a/libmpdemux/Makefile
+++ b/libmpdemux/Makefile
@@ -3,7 +3,7 @@ LIBNAME = libmpdemux.a
include ../config.mak
-SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c aviwrite.c demux_asf.c demux_avi.c demux_mov.c demux_mpg.c demux_viv.c demuxer.c dvdauth.c open.c parse_es.c stream.c tv.c tvi_dummy.c tvi_v4l.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c
+SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c aviwrite.c demux_asf.c demux_avi.c demux_mov.c demux_mpg.c demux_viv.c demuxer.c dvdauth.c open.c parse_es.c stream.c tv.c tvi_dummy.c tvi_v4l.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c
ifeq ($(STREAMING),yes)
SRCS += asf_streaming.c url.c http.c network.c rtp.c
endif
diff --git a/libmpdemux/demux_audio.c b/libmpdemux/demux_audio.c
new file mode 100644
index 0000000000..a8c7bfb468
--- /dev/null
+++ b/libmpdemux/demux_audio.c
@@ -0,0 +1,249 @@
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "stream.h"
+#include "demuxer.h"
+#include "stheader.h"
+#include "genres.h"
+
+#include <string.h>
+#ifdef MP_DEBUG
+#include <assert.h>
+#endif
+
+#define MP3 1
+#define WAV 2
+
+
+#define HDR_SIZE 4
+
+typedef struct da_priv {
+ int frmt;
+} da_priv_t;
+
+extern int mp_decode_mp3_header(unsigned char* hbuf);
+extern void free_sh_audio(sh_audio_t* sh);
+
+
+int demux_audio_open(demuxer_t* demuxer) {
+ stream_t *s;
+ sh_audio_t* sh_audio;
+ uint8_t hdr[HDR_SIZE];
+ int st_pos = 0,frmt = 0, n = 0, pos = 0, step;
+ da_priv_t* priv;
+#ifdef MP_DEBUG
+ assert(demuxer != NULL);
+ assert(demuxer->stream != NULL);
+#endif
+
+ s = demuxer->stream;
+
+ while(n < 5 && ! s->eof) {
+ st_pos = stream_tell(s);
+ step = 1;
+ if(pos < HDR_SIZE) {
+ stream_read(s,&hdr[pos],HDR_SIZE-pos);
+ pos = HDR_SIZE;
+ }
+
+ if( hdr[0] == 'R' && hdr[1] == 'I' && hdr[2] == 'F' && hdr[3] == 'F' ) {
+ stream_skip(s,4);
+ if(s->eof)
+ break;
+ stream_read(s,hdr,4);
+ if(s->eof)
+ break;
+ if(hdr[0] != 'W' || hdr[1] != 'A' || hdr[2] != 'V' || hdr[3] != 'E' )
+ stream_skip(s,-8);
+ else
+ // We found wav header. Now we can have 'fmt ' or a mp3 header
+ // empty the buffer
+ step = 4;
+ } else if( hdr[0] == 'f' && hdr[1] == 'm' && hdr[2] == 't' && hdr[3] == ' ' ) {
+ frmt = WAV;
+ break;
+ } else if(mp_decode_mp3_header(hdr) > 0) {
+ frmt = MP3;
+ break;
+ }
+ // Add here some other audio format detection
+ if(step < HDR_SIZE)
+ memmove(hdr,&hdr[step],HDR_SIZE-step);
+ pos -= step;
+ }
+
+ if(!frmt)
+ return 0;
+
+ sh_audio = new_sh_audio(demuxer,0);
+
+ switch(frmt) {
+ case MP3:
+ sh_audio->format = 0x55;
+ stream_seek(s,st_pos);
+ demuxer->movi_start = st_pos;
+ if(s->end_pos) {
+ char tag[4];
+ stream_seek(s,s->end_pos-128);
+ stream_read(s,tag,3);
+ tag[3] = '\0';
+ if(strcmp(tag,"TAG"))
+ demuxer->movi_end = s->end_pos;
+ else {
+ char buf[31];
+ uint8_t g;
+ demuxer->movi_end = stream_tell(s)-3;
+ stream_read(s,buf,30);
+ buf[30] = '\0';
+ demux_info_add(demuxer,"Title",buf);
+ stream_read(s,buf,30);
+ buf[30] = '\0';
+ demux_info_add(demuxer,"Artist",buf);
+ stream_read(s,buf,30);
+ buf[30] = '\0';
+ demux_info_add(demuxer,"Album",buf);
+ stream_read(s,buf,4);
+ buf[5] = '\0';
+ demux_info_add(demuxer,"Year",buf);
+ stream_read(s,buf,30);
+ buf[30] = '\0';
+ demux_info_add(demuxer,"Comment",buf);
+ if(buf[28] == 0 && buf[29] != 0) {
+ uint8_t trk = (uint8_t)buf[29];
+ sprintf(buf,"%d",trk);
+ demux_info_add(demuxer,"Track",buf);
+ }
+ g = stream_read_char(s);
+ demux_info_add(demuxer,"Genre",genres[g]);
+ }
+ }
+ break;
+ case WAV: {
+ WAVEFORMATEX* w;
+ int l;
+ sh_audio->wf = w = (WAVEFORMATEX*)malloc(sizeof(WAVEFORMATEX));
+ l = stream_read_dword_le(s);
+ if(l < 16) {
+ printf("Bad wav header length : too short !!!\n");
+ free_sh_audio(sh_audio);
+ return 0;
+ }
+ w->wFormatTag = sh_audio->format = stream_read_word_le(s);
+ w->nChannels = sh_audio->channels = stream_read_word_le(s);
+ w->nSamplesPerSec = sh_audio->samplerate = stream_read_dword_le(s);
+ w->nAvgBytesPerSec = stream_read_dword_le(s);
+ w->nBlockAlign = stream_read_word_le(s);
+ w->wBitsPerSample = sh_audio->samplesize = stream_read_word_le(s);
+ w->cbSize = 0;
+ l -= 16;
+ if(l)
+ stream_skip(s,l);
+ demuxer->movi_start = stream_tell(s);
+ demuxer->movi_end = s->end_pos;
+ } break;
+ }
+
+ priv = (da_priv_t*)malloc(sizeof(da_priv_t));
+ priv->frmt = frmt;
+ demuxer->priv = priv;
+ demuxer->movi_start = st_pos;
+ demuxer->audio->id = 0;
+ demuxer->audio->sh = sh_audio;
+ sh_audio->ds = demuxer->audio;
+
+ if(stream_tell(s) != demuxer->movi_start)
+ stream_seek(s,demuxer->movi_start);
+
+ return 1;
+}
+
+
+int demux_audio_fill_buffer(demux_stream_t *ds) {
+ sh_audio_t* sh_audio;
+ demuxer_t* demux;
+ da_priv_t* priv;
+ stream_t* s;
+#ifdef MP_DEBUG
+ assert(ds != NULL);
+ assert(ds->sh != NULL);
+ assert(ds->demuxer != NULL);
+#endif
+ sh_audio = ds->sh;
+ demux = ds->demuxer;
+ priv = demux->priv;
+ s = demux->stream;
+
+ if(s->eof || (demux->movi_end && stream_tell(s) >= demux->movi_end) )
+ return 0;
+
+ switch(priv->frmt) {
+ case MP3 :
+ while(! s->eof || (demux->movi_end && stream_tell(s) >= demux->movi_end) ) {
+ uint8_t hdr[4];
+ int len;
+ stream_read(s,hdr,4);
+ len = mp_decode_mp3_header(hdr);
+ if(len < 0) {
+ stream_skip(s,-3);
+ } else {
+ demux_packet_t* dp;
+ if(s->eof || (demux->movi_end && stream_tell(s) >= demux->movi_end) )
+ return 0;
+ dp = new_demux_packet(len);
+ memcpy(dp->buffer,hdr,4);
+ stream_read(s,dp->buffer + 4,len-4);
+ ds_add_packet(ds,dp);
+ return 1;
+ }
+ }
+ case WAV : {
+ int l = sh_audio->wf->nAvgBytesPerSec;
+ demux_packet_t* dp = new_demux_packet(l);
+ stream_read(s,dp->buffer,l);
+ ds_add_packet(ds,dp);
+ return 1;
+ }
+ default:
+ printf("Audio demuxer : unknow format %d\n",priv->frmt);
+ }
+
+
+ return 0;
+}
+
+void demux_audio_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){
+ sh_audio_t* sh_audio;
+ stream_t* s;
+ int base,pos;
+ float len;
+ da_priv_t* priv;
+
+ sh_audio = demuxer->audio->sh;
+ s = demuxer->stream;
+ priv = demuxer->priv;
+
+ base = flags&1 ? demuxer->movi_start : stream_tell(s) ;
+ len = (demuxer->movi_end && flags&2) ? (demuxer->movi_end - demuxer->movi_start)*rel_seek_secs : rel_seek_secs;
+
+ pos = base+(len*sh_audio->i_bps);
+
+ if(demuxer->movi_end && pos >= demuxer->movi_end) {
+ sh_audio->timer = (stream_tell(s) - demuxer->movi_start)/sh_audio->i_bps;
+ return;
+ } else if(pos < demuxer->movi_start)
+ pos = demuxer->movi_start;
+
+
+ sh_audio->timer = flags&1 ? rel_seek_secs : (pos-demuxer->movi_start)/sh_audio->i_bps;
+
+ switch(priv->frmt) {
+ case WAV:
+ pos += (pos % (sh_audio->channels * sh_audio->samplesize) );
+ break;
+ }
+
+ stream_seek(s,pos);
+
+}
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index 89fecbc265..dc482511e3 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -125,6 +125,11 @@ void free_demuxer(demuxer_t *demuxer){
// free demuxers:
free_demuxer_stream(demuxer->audio);
free_demuxer_stream(demuxer->video);
+ if(demuxer->info) {
+ for(i=0;demuxer->info[i] != NULL; i++)
+ free(demuxer->info[i]);
+ free(demuxer->info);
+ }
free(demuxer);
}
@@ -186,6 +191,7 @@ extern int demux_tv_fill_buffer(demuxer_t *demux, tvi_handle_t *tvh);
extern int demux_open_tv(demuxer_t *demuxer, tvi_handle_t *tvh);
#endif
int demux_y4m_fill_buffer(demuxer_t *demux);
+int demux_audio_fill_buffer(demux_stream_t *ds);
int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){
// Note: parameter 'ds' can be NULL!
@@ -209,6 +215,7 @@ int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){
case DEMUXER_TYPE_TV: return demux_tv_fill_buffer(demux, tv_handler);
#endif
case DEMUXER_TYPE_Y4M: return demux_y4m_fill_buffer(demux);
+ case DEMUXER_TYPE_AUDIO: return demux_audio_fill_buffer(ds);
}
return 0;
}
@@ -398,6 +405,7 @@ extern void demux_open_real(demuxer_t *demuxer);
extern int nuv_check_file(demuxer_t *demuxer);
extern void demux_open_nuv(demuxer_t *demuxer);
+extern int demux_audio_open(demuxer_t* demuxer);
demuxer_t* demux_open(stream_t *stream,int file_format,int audio_id,int video_id,int dvdsub_id){
@@ -535,6 +543,15 @@ if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_ROQ){
} else
free_demuxer(demuxer);
}
+//=============== Try to open as audio file: =================
+if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_AUDIO){
+ demuxer=new_demuxer(stream,DEMUXER_TYPE_AUDIO,audio_id,video_id,dvdsub_id);
+ if(demux_audio_open(demuxer)){
+ mp_msg(MSGT_DEMUXER,MSGL_INFO,"Detected audio file\n");
+ file_format=DEMUXER_TYPE_AUDIO;
+ } else
+ free_demuxer(demuxer);
+}
//=============== Try to open as MPEG-PS file: =================
if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_MPEG_PS){
int pes=1;
@@ -749,6 +766,7 @@ int demux_seek_fli(demuxer_t *demuxer,float rel_seek_secs,int flags);
int demux_seek_mf(demuxer_t *demuxer,float rel_seek_secs,int flags);
int demux_seek_nuv(demuxer_t *demuxer,float rel_seek_secs,int flags);
void demux_seek_mov(demuxer_t *demuxer,float pts,int flags);
+extern void demux_audio_seek(demuxer_t *demuxer,float rel_seek_secs,int flags);
int demux_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){
demux_stream_t *d_audio=demuxer->audio;
@@ -808,6 +826,8 @@ switch(demuxer->file_format){
demux_seek_fli(demuxer,rel_seek_secs,flags); break;
case DEMUXER_TYPE_NUV:
demux_seek_nuv(demuxer,rel_seek_secs,flags); break;
+ case DEMUXER_TYPE_AUDIO:
+ demux_audio_seek(demuxer,rel_seek_secs,flags); break;
} // switch(demuxer->file_format)
@@ -817,86 +837,38 @@ return 1;
int demux_info_add(demuxer_t *demuxer, char *opt, char *param)
{
- demuxer_info_t *info = &demuxer->info;
-
- if (!strcasecmp(opt, "name"))
- {
- if (info->name)
- {
- mp_msg(MSGT_DEMUX, MSGL_WARN, "Demuxer info->name already present\n!");
- return(0);
- }
- info->name = strdup(param);
- return(1);
- }
-
- if (!strcasecmp(opt, "author"))
- {
- if (info->author)
- {
- mp_msg(MSGT_DEMUX, MSGL_WARN, "Demuxer info->author already present\n!");
- return(0);
- }
- info->author = strdup(param);
- return(1);
- }
-
- if (!strcasecmp(opt, "encoder") || !strcasecmp(opt, "software"))
- {
- if (info->encoder)
- {
- mp_msg(MSGT_DEMUX, MSGL_WARN, "Demuxer info->encoder already present\n!");
- return(0);
- }
- info->encoder = strdup(param);
- return(1);
- }
+ char **info = demuxer->info;
+ int n = 0;
- if (!strcasecmp(opt, "comment") || !strcasecmp(opt, "comments"))
- {
- if (info->comments)
- {
- mp_msg(MSGT_DEMUX, MSGL_WARN, "Demuxer info->comments already present\n!");
- return(0);
- }
- info->comments = strdup(param);
- return(1);
- }
- if (!strcasecmp(opt, "copyright"))
- {
- if (info->copyright)
- {
- mp_msg(MSGT_DEMUX, MSGL_WARN, "Demuxer info->copyright already present\n!");
- return(0);
- }
- info->copyright = strdup(param);
- return(1);
- }
+ for(n = 0; info && info[2*n] != NULL; n++)
+ {
+ if(!strcasecmp(opt,info[2*n]))
+ {
+ mp_msg(MSGT_DEMUX, MSGL_WARN, "Demuxer info %s already present\n!",opt);
+ return 0;
+ }
+ }
+
+ info = demuxer->info = (char**)realloc(info,(2*(n+2))*sizeof(char*));
+ info[2*n] = strdup(opt);
+ info[2*n+1] = strdup(param);
+ memset(&info[2*(n+1)],0,2*sizeof(char*));
- mp_msg(MSGT_DEMUX, MSGL_DBG2, "Unknown demuxer info->%s (=%s)!\n",
- opt, param);
- return(1);
+ return 1;
}
int demux_info_print(demuxer_t *demuxer)
{
- demuxer_info_t *info = &demuxer->info;
+ char **info = demuxer->info;
+ int n;
- if (info->name || info->author || info->encoder || info->comments || info->copyright)
- {
- mp_msg(MSGT_DEMUX, MSGL_INFO, "Clip info: \n");
- if (info->name)
- mp_msg(MSGT_DEMUX, MSGL_INFO, " Name: %s\n", info->name);
- if (info->author)
- mp_msg(MSGT_DEMUX, MSGL_INFO, " Author: %s\n", info->author);
- if (info->copyright)
- mp_msg(MSGT_DEMUX, MSGL_INFO, " Copyright: %s\n", info->copyright);
- if (info->comments)
- mp_msg(MSGT_DEMUX, MSGL_INFO, " Comments: %s\n", info->comments);
- if (info->encoder)
- mp_msg(MSGT_DEMUX, MSGL_INFO, " Encoder: %s\n", info->encoder);
- }
+ if(!info)
+ return 0;
+
+ mp_msg(MSGT_DEMUX, MSGL_INFO, "Clip info: \n");
+ for(n = 0; info[2*n] != NULL ; n++)
+ mp_msg(MSGT_DEMUX, MSGL_INFO, " %s: %s\n",info[2*n],info[2*n+1]);
return 0;
}
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index b9389f7704..f50d93dfe3 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -19,6 +19,7 @@
#define DEMUXER_TYPE_FILM 14
#define DEMUXER_TYPE_ROQ 15
#define DEMUXER_TYPE_MF 16
+#define DEMUXER_TYPE_AUDIO 17
#define DEMUXER_TIME_NONE 0
#define DEMUXER_TIME_PTS 1
@@ -94,7 +95,7 @@ typedef struct demuxer_st {
char s_streams[32]; // dvd subtitles (flag)
void* priv; // fileformat-dependent data
- demuxer_info_t info;
+ char** info;
} demuxer_t;
inline static demux_packet_t* new_demux_packet(int len){
diff --git a/libmpdemux/genres.h b/libmpdemux/genres.h
new file mode 100644
index 0000000000..4029475451
--- /dev/null
+++ b/libmpdemux/genres.h
@@ -0,0 +1,277 @@
+/***********************************
+ * Copyright (C) 2001 Jason Carter
+ * See the file "LICENSE" for details
+ ***********************************
+ * FILE: GENRES.H
+ * NAME: ID3EDIT - ID3 tag v 1.1 editor
+ * DESCRIPTION: Genres character array
+ * AUTHOR: Jason Carter
+ ***********************************
+ */
+
+
+#ifndef _GENRES_H
+#define _GENRES_H
+
+
+char *genres[] = {
+"Blues", /* 0 */
+"Classic Rock", /* 1 */
+"Country", /* 2 */
+"Dance", /* 3 */
+"Disco", /* 4 */
+"Funk", /* 5 */
+"Grunge", /* 6 */
+"Hip-Hop", /* 7 */
+"Jazz", /* 8 */
+"Metal", /* 9 */
+"New Age", /* 10 */
+"Oldies", /* 11 */
+"Other", /* 12 */
+"Pop", /* 13 */
+"R&B", /* 14 */
+"Rap", /* 15 */
+"Reggae", /* 16 */
+"Rock", /* 17 */
+"Techno", /* 18 */
+"Industrial", /* 19 */
+"Alternative", /* 20 */
+"Ska", /* 21 */
+"Death Metal", /* 22 */
+"Pranks", /* 23 */
+"Soundtrack", /* 24 */
+"Eurotechno", /* 25 */
+"Ambient", /* 26 */
+"Trip-Hop", /* 27 */
+"Vocal", /* 28 */
+"Jazz+Funk", /* 29 */
+"Fusion", /* 30 */
+"Trance", /* 31 */
+"Classical", /* 32 */
+"Instrumental", /* 33 */
+"Acid", /* 34 */
+"House", /* 35 */
+"Game", /* 36 */
+"Sound Clip", /* 37 */
+"Gospel", /* 38 */
+"Noise", /* 39 */
+"Alternative Rock", /* 40 */
+"Bass", /* 41 */
+"Soul", /* 42 */
+"Punk", /* 43 */
+"Space", /* 44 */
+"Meditative", /* 45 */
+"Instrumental Pop", /* 46 */
+"Instrumental Rock", /* 47 */
+"Ethnic", /* 48 */
+"Gothic", /* 49 */
+"Darkwave", /* 50 */
+"Techno-Industrial", /* 51 */
+"Electronic", /* 52 */
+"Jungle", /* 53 */
+"Pop-Folk", /* 54 */
+"Eurodance", /* 55 */
+"Dream", /* 56 */
+"Southern Rock", /* 57 */
+"Comedy", /* 58 */
+"Cult", /* 59 */
+"Gangsta", /* 60 */
+"Top 40", /* 61 */
+"Christian Rap", /* 62 */
+"Pop/Funk", /* 63 */
+"Native American", /* 64 */
+"Cabaret", /* 65 */
+"New Wave", /* 66 */
+"Psychadelic", /* 67 */
+"Rave", /* 68 */
+"Show Tunes", /* 69 */
+"Trailer", /* 70 */
+"Lo-Fi", /* 71 */
+"Tribal", /* 72 */
+"Acid Punk", /* 73 */
+"Acid Jazz", /* 74 */
+"Polka", /* 75 */
+"Retro", /* 76 */
+"Musical", /* 77 */
+"Rock & Roll", /* 78 */
+"Hard Rock", /* 79 */
+"Folk", /* 80 */
+"Folk/Rock", /* 81 */
+"National Folk", /* 82 */
+"Swing", /* 83 */
+"Fast-Fusion", /* 84 */
+"Bebop", /* 85 */
+"Latin", /* 86 */
+"Revival", /* 87 */
+"Celtic", /* 88 */
+"Bluegrass", /* 89 */
+"Avantgarde", /* 90 */
+"Gothic Rock", /* 91 */
+"Progressive Rock", /* 92 */
+"Psychedelic Rock", /* 93 */
+"Symphonic Rock", /* 94 */
+"Slow Rock", /* 95 */
+"Big Band", /* 96 */
+"Chorus", /* 97 */
+"Easy Listening", /* 98 */
+"Acoustic", /* 99 */
+"Humour", /* 100 */
+"Speech", /* 101 */
+"Chanson", /* 102 */
+"Opera", /* 103 */
+"Chamber Music", /* 104 */
+"Sonata", /* 105 */
+"Symphony", /* 106 */
+"Booty Bass", /* 107 */
+"Primus", /* 108 */
+"Porn Groove", /* 109 */
+"Satire", /* 110 */
+"Slow Jam", /* 111 */
+"Club", /* 112 */
+"Tango", /* 113 */
+"Samba", /* 114 */
+"Folklore", /* 115 */
+"Ballad", /* 116 */
+"Power Ballad", /* 117 */
+"Rhytmic Soul", /* 118 */
+"Freestyle", /* 119 */
+"Duet", /* 120 */
+"Punk Rock", /* 121 */
+"Drum Solo", /* 122 */
+"Acapella", /* 123 */
+"Euro-House", /* 124 */
+"Dance Hall", /* 125 */
+"Goa", /* 126 */
+"Drum & Bass", /* 127 */
+"Club-House", /* 128 */
+"Hardcore", /* 129 */
+"Terror", /* 130 */
+"Indie", /* 131 */
+"BritPop", /* 132 */
+"Negerpunk", /* 133 */
+"Polsk Punk", /* 134 */
+"Beat", /* 135 */
+"Christian Gangsta Rap", /* 136 */
+"Heavy Metal", /* 137 */
+"Black Metal", /* 138 */
+"Crossover", /* 139 */
+"Contemporary Christian", /* 140 */
+"Christian Rock", /* 141 */
+"Unknown", /* 142 */
+"Unknown", /* 143 */
+"Unknown", /* 144 */
+"Unknown", /* 145 */
+"Unknown", /* 146 */
+"Unknown", /* 147 */
+"Unknown", /* 148 */
+"Unknown", /* 149 */
+"Unknown", /* 150 */
+"Unknown", /* 151 */
+"Unknown", /* 152 */
+"Unknown", /* 153 */
+"Unknown", /* 154 */
+"Unknown", /* 155 */
+"Unknown", /* 156 */
+"Unknown", /* 157 */
+"Unknown", /* 158 */
+"Unknown", /* 159 */
+"Unknown", /* 160 */
+"Unknown", /* 161 */
+"Unknown", /* 162 */
+"Unknown", /* 163 */
+"Unknown", /* 164 */
+"Unknown", /* 165 */
+"Unknown", /* 166 */
+"Unknown", /* 167 */
+"Unknown", /* 168 */
+"Unknown", /* 169 */
+"Unknown", /* 170 */
+"Unknown", /* 171 */
+"Unknown", /* 172 */
+"Unknown", /* 173 */
+"Unknown", /* 174 */
+"Unknown", /* 175 */
+"Unknown", /* 176 */
+"Unknown", /* 177 */
+"Unknown", /* 178 */
+"Unknown", /* 179 */
+"Unknown", /* 180 */
+"Unknown", /* 181 */
+"Unknown", /* 182 */
+"Unknown", /* 183 */
+"Unknown", /* 184 */
+"Unknown", /* 185 */
+"Unknown", /* 186 */
+"Unknown", /* 187 */
+"Unknown", /* 188 */
+"Unknown", /* 189 */
+"Unknown", /* 190 */
+"Unknown", /* 191 */
+"Unknown", /* 192 */
+"Unknown", /* 193 */
+"Unknown", /* 194 */
+"Unknown", /* 195 */
+"Unknown", /* 196 */
+"Unknown", /* 197 */
+"Unknown", /* 198 */
+"Unknown", /* 199 */
+"Unknown", /* 200 */
+"Unknown", /* 201 */
+"Unknown", /* 202 */
+"Unknown", /* 203 */
+"Unknown", /* 204 */
+"Unknown", /* 205 */
+"Unknown", /* 206 */
+"Unknown", /* 207 */
+"Unknown", /* 208 */
+"Unknown", /* 209 */
+"Unknown", /* 210 */
+"Unknown", /* 211 */
+"Unknown", /* 212 */
+"Unknown", /* 213 */
+"Unknown", /* 214 */
+"Unknown", /* 215 */
+"Unknown", /* 216 */
+"Unknown", /* 217 */
+"Unknown", /* 218 */
+"Unknown", /* 219 */
+"Unknown", /* 220 */
+"Unknown", /* 221 */
+"Unknown", /* 222 */
+"Unknown", /* 223 */
+"Unknown", /* 224 */
+"Unknown", /* 225 */
+"Unknown", /* 226 */
+"Unknown", /* 227 */
+"Unknown", /* 228 */
+"Unknown", /* 229 */
+"Unknown", /* 230 */
+"Unknown", /* 231 */
+"Unknown", /* 232 */
+"Unknown", /* 233 */
+"Unknown", /* 234 */
+"Unknown", /* 235 */
+"Unknown", /* 236 */
+"Unknown", /* 237 */
+"Unknown", /* 238 */
+"Unknown", /* 239 */
+"Unknown", /* 240 */
+"Unknown", /* 241 */
+"Unknown", /* 242 */
+"Unknown", /* 243 */
+"Unknown", /* 244 */
+"Unknown", /* 245 */
+"Unknown", /* 246 */
+"Unknown", /* 247 */
+"Unknown", /* 248 */
+"Unknown", /* 249 */
+"Unknown", /* 250 */
+"Unknown", /* 251 */
+"Unknown", /* 252 */
+"Unknown", /* 253 */
+"Unknown", /* 254 */
+"Unknown", /* 255 */
+};
+
+
+#endif /* _GENRES_H */
diff --git a/libmpdemux/mp3_hdr.c b/libmpdemux/mp3_hdr.c
index 180c0c6cc3..b2ac948b5b 100644
--- a/libmpdemux/mp3_hdr.c
+++ b/libmpdemux/mp3_hdr.c
@@ -1,6 +1,7 @@
#include <stdio.h>
#include "config.h"
+#include "../mp_msg.h"
//----------------------- mp3 audio frame header parser -----------------------
@@ -32,12 +33,15 @@ int mp_decode_mp3_header(unsigned char* hbuf){
// head_check:
if( (newhead & 0xffe00000) != 0xffe00000 ||
(newhead & 0x0000fc00) == 0x0000fc00){
- printf("head_check failed\n");
+ mp_msg(MSGT_DEMUXER,MSGL_DBG2,"head_check failed\n");
return -1;
}
#endif
- if((4-((newhead>>17)&3))!=3){ printf("not layer-3\n"); return -1;}
+ if((4-((newhead>>17)&3))!=3){
+ mp_msg(MSGT_DEMUXER,MSGL_DBG2,"not layer-3\n");
+ return -1;
+ }
if( newhead & ((long)1<<20) ) {
lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1;
@@ -53,7 +57,7 @@ int mp_decode_mp3_header(unsigned char* hbuf){
sampling_frequency = ((newhead>>10)&0x3) + (lsf*3);
if(sampling_frequency>8){
- printf("invalid sampling_frequency\n");
+ mp_msg(MSGT_DEMUXER,MSGL_DBG2,"invalid sampling_frequency\n");
return -1; // valid: 0..8
}
@@ -70,7 +74,7 @@ int mp_decode_mp3_header(unsigned char* hbuf){
stereo = ( (((newhead>>6)&0x3)) == 3) ? 1 : 2;
if(!bitrate_index){
- fprintf(stderr,"Free format not supported.\n");
+ mp_msg(MSGT_DEMUXER,MSGL_DBG2,"Free format not supported.\n");
return -1;
}