/* Interface to MP3 LAME encoding engine
* Copyright 1999 Mark Taylor
*/
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include "config.h"
/* for size_t typedef */
#include <stddef.h>
/* for va_list typedef */
#include <stdarg.h>
/* for FILE typedef, TODO: remove when removing lame_mp3_tags_fid */
#include <stdio.h>
typedef void (*lame_report_function)(const char *format, va_list ap);
#if defined(WIN32) || defined(_WIN32)
#undef CDECL
#define CDECL __cdecl
#else
#define CDECL
#endif
#define DEPRECATED_OR_OBSOLETE_CODE_REMOVED 1
typedef enum vbr_mode_e {
vbr_off=0,
vbr_mt, /* obsolete, same as vbr_mtrh */
vbr_rh,
vbr_abr,
vbr_mtrh,
vbr_max_indicator, /* Don't use this! It's used for sanity checks. */
vbr_default=vbr_mtrh /* change this to change the default VBR mode of LAME */
} vbr_mode;
/* MPEG modes */
typedef enum MPEG_mode_e {
STEREO = 0,
JOINT_STEREO,
DUAL_CHANNEL, /* LAME doesn't supports this! */
MONO,
NOT_SET,
MAX_INDICATOR /* Don't use this! It's used for sanity checks. */
} MPEG_mode;
/* Padding types */
typedef enum Padding_type_e {
PAD_NO = 0,
PAD_ALL,
PAD_ADJUST,
PAD_MAX_INDICATOR /* Don't use this! It's used for sanity checks. */
} Padding_type;
/*presets*/
typedef enum preset_mode_e {
/*values from 8 to 320 should be reserved for abr bitrates*/
/*for abr I'd suggest to directly use the targeted bitrate as a value*/
ABR_8 = 8,
ABR_320 = 320,
V9 = 410, /*Vx to match Lame and VBR_xx to match FhG*/
VBR_10 = 410,
V8 = 420,
VBR_20 = 420,
V7 = 430,
VBR_30 = 430,
V6 = 440,
VBR_40 = 440,
V5 = 450,
VBR_50 = 450,
V4 = 460,
VBR_60 = 460,
V3 = 470,
VBR_70 = 470,
V2 = 480,
VBR_80 = 480,
V1 = 490,
VBR_90 = 490,
V0 = 500,
VBR_100 = 500,
/*still there for compatibility*/
R3MIX = 1000,
STANDARD = 1001,
EXTREME = 1002,
INSANE = 1003,
STANDARD_FAST = 1004,
EXTREME_FAST = 1005,
MEDIUM = 1006,
MEDIUM_FAST = 1007
} preset_mode;
/*asm optimizations*/
typedef enum asm_optimizations_e {
MMX = 1,
AMD_3DNOW = 2,
SSE = 3
} asm_optimizations;
/* psychoacoustic model */
typedef enum Psy_model_e {
PSY_GPSYCHO = 1,
PSY_NSPSYTUNE = 2
} Psy_model;
/* buffer considerations */
enum buffer_constraint{
MDB_DEFAULT,MDB_STRICT_ISO,MDB_MAXIMUM
};
struct lame_global_struct;
typedef struct lame_global_struct lame_global_flags;
typedef lame_global_flags *lame_t;
/***********************************************************************
*
* The LAME API
* These functions should be called, in this order, for each
* MP3 file to be encoded. See the file "API" for more documentation
*
***********************************************************************/
/*
* REQUIRED:
* initialize the encoder. sets default for all encoder parameters,
* returns NULL if some malloc()'s failed
* otherwise returns pointer to structure needed for all future
* API calls.
*/
lame_global_flags * lame_init(void);
/*
* OPTIONAL:
* set as needed to override defaults
*/
/********************************************************************
* input stream description
***********************************************************************/
/*
* OPTIONAL:
* get the version number, in a string. of the form:
* "3.63 (beta)" or just "3.63".
*/
const char* get_lame_version ();
const char* get_lame_short_version ();
const char* get_lame_very_short_version ();
const char* get_psy_version ();
const char* get_lame_url ();
const char* get_lame_os_bitness ();
/*
* OPTIONAL:
* get the version numbers in numerical form.
*/
typedef struct {
/* generic LAME version */
int major;
int minor;
int alpha; /* 0 if not an alpha version */
int beta; /* 0 if not a beta version */
/* version of the psy model */
int psy_major;
int psy_minor;
int psy_alpha; /* 0 if not an alpha version */
int psy_beta; /* 0 if not a beta version */
/* compile time features */
const char *features; /* Don't make assumptions about the contents! */
} lame_version_t;
void get_lame_version_numerical(lame_version_t *);
/*********************************************************************
*
* decoding
*
* a simple interface to mpglib, part of mpg123, is also included if
* libmp3lame is compiled with HAVE_MPGLIB
*
*********************************************************************/
struct hip_global_struct;
typedef struct hip_global_struct hip_global_flags;
typedef hip_global_flags *hip_t;
typedef struct {
int header_parsed; /* 1 if header was parsed and following data was
computed */
int stereo; /* number of channels */
int samplerate; /* sample rate */
int bitrate; /* bitrate */
int mode; /* mp3 frame type */
int mode_ext; /* mp3 frame type */
int framesize; /* number of samples per mp3 frame */
/* this data is only computed if mpglib detects a Xing VBR header */
unsigned long nsamp; /* number of samples in mp3 file. */
int totalframes; /* total number of frames in mp3 file */
/* this data is not currently computed by the mpglib routines */
int framenum; /* frames decoded counter */
} mp3data_struct;
/* required call to initialize decoder */
hip_t CDECL hip_decode_init(void);
/* cleanup call to exit decoder */
int CDECL hip_decode_exit(hip_t gfp);
/* HIP reporting functions */
void CDECL hip_set_errorf(hip_t gfp, lame_report_function f);
void CDECL hip_set_debugf(hip_t gfp, lame_report_function f);
void CDECL hip_set_msgf (hip_t gfp, lame_report_function f);
/*********************************************************************
* input 1 mp3 frame, output (maybe) pcm data.
*
* nout = hip_decode(hip, mp3buf,len,pcm_l,pcm_r);
*
* input:
* len : number of bytes of mp3 data in mp3buf
* mp3buf[len] : mp3 data to be decoded
*
* output:
* nout: -1 : decoding error
* 0 : need more data before we can complete the decode
* >0 : returned 'nout' samples worth of data in pcm_l,pcm_r
* pcm_l[nout] : left channel data
* pcm_r[nout] : right channel data
*
*********************************************************************/
int CDECL hip_decode( hip_t gfp
, unsigned char * mp3buf
, size_t len
, short pcm_l[]
, short pcm_r[]
);
/* same as hip_decode, and also returns mp3 header data */
int CDECL hip_decode_headers( hip_t gfp
, unsigned char* mp3buf
, size_t len
, short pcm_l[]
, short pcm_r[]
, mp3data_struct* mp3data
);
/* same as hip_decode, but returns at most one frame */
int CDECL hip_decode1( hip_t gfp
, unsigned char* mp3buf
, size_t len
, short pcm_l[]
, short pcm_r[]
);
/* same as hip_decode1, but returns at most one frame and mp3 header data */
int CDECL hip_decode1_headers( hip_t gfp
, unsigned char* mp3buf
, size_t len
, short pcm_l[]
, short pcm_r[]
, mp3data_struct* mp3data
);
/* same as hip_decode1_headers, but also returns enc_delay and enc_padding
from VBR Info tag, (-1 if no info tag was found) */
int CDECL hip_decode1_headersB( hip_t gfp
, unsigned char* mp3buf
, size_t len
, short pcm_l[]
, short pcm_r[]
, mp3data_struct* mp3data
, int *enc_delay
, int *enc_padding
);
/* OBSOLETE:
* lame_decode... functions are there to keep old code working
* but it is strongly recommended to replace calls by hip_decode...
* function calls, see above.
*/
#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
#else
int CDECL lame_decode_init(void);
int CDECL lame_decode(
unsigned char * mp3buf,
int len,
short pcm_l[],
short pcm_r[] );
int CDECL lame_decode_headers(
unsigned char* mp3buf,
int len,
short pcm_l[],
short pcm_r[],
mp3data_struct* mp3data );
int CDECL lame_decode1(
unsigned char* mp3buf,
int len,
short pcm_l[],
short pcm_r[] );
int CDECL lame_decode1_headers(
unsigned char* mp3buf,
int len,
short pcm_l[],
short pcm_r[],
mp3data_struct* mp3data );
int CDECL lame_decode1_headersB(
unsigned char* mp3buf,
int len,
short pcm_l[],
short pcm_r[],
mp3data_struct* mp3data,
int *enc_delay,
int *enc_padding );
int CDECL lame_decode_exit(void);
#endif /* obsolete lame_decode API calls */
/*********************************************************************
*
* id3tag stuff
*
*********************************************************************/
/* id3tag.h -- Interface to write ID3 version 1 and 2 tags.
* Copyright (C) 2000 Don Melton.
*/
/* utility to obtain alphabetically sorted list of genre names with numbers */
void id3tag_genre_list(
void (*handler)(int, const char *, void *),
void* cookie);
void id3tag_init (lame_global_flags & gfp);
/* force addition of version 2 tag */
void id3tag_add_v2 (lame_global_flags & gfp);
/* add only a version 1 tag */
void id3tag_v1_only (lame_global_flags & gfp);
/* add only a version 2 tag */
void id3tag_v2_only (lame_global_flags & gfp);
/* pad version 1 tag with spaces instead of nulls */
void id3tag_space_v1 (lame_global_flags & gfp);
/* pad version 2 tag with extra 128 bytes */
void id3tag_pad_v2 (lame_global_flags & gfp);
/* pad version 2 tag with extra n bytes */
void id3tag_set_pad (lame_global_flags & , size_t n);
void id3tag_set_title(lame_global_flags & gfp, const char* title);
void id3tag_set_artist(lame_global_flags & gfp, const char* artist);
void id3tag_set_album(lame_global_flags & gfp, const char* album);
void id3tag_set_year(lame_global_flags & gfp, const char* year);
void id3tag_set_comment(lame_global_flags & gfp, const char* comment);
/* return -1 result if track number is out of ID3v1 range
and ignored for ID3v1 */
int id3tag_set_track(lame_global_flags & gfp, const char* track);
/* return non-zero result if genre name or number is invalid
result 0: OK
result -1: genre number out of range
result -2: no valid ID3v1 genre name, mapped to ID3v1 'Other'
but taken as-is for ID3v2 genre tag */
int id3tag_set_genre(lame_global_flags & gfp, const char* genre);
/* return non-zero result if field name is invalid */
int id3tag_set_fieldvalue(lame_global_flags & gfp, const char* fieldvalue);
/* return non-zero result if image type is invalid */
int id3tag_set_albumart(lame_global_flags & gfp, const char* image, size_t size);
/* lame_get_id3v2_tag copies ID3v2 tag into buffer.
* Function returns number of bytes copied into buffer, or number
* of bytes rquired if buffer 'size' is too small.
* Function fails, if returned value is larger than 'size'.
* NOTE:
* This functions does nothing, if user/LAME disabled ID3v2 tag.
*/
size_t lame_get_id3v2_tag(lame_global_flags&gfp, unsigned char* buffer, size_t size);
/* experimental */
//int id3tag_set_textinfo_latin1(lame_global_flags&, char const*, char const*);
/* experimental */
//int id3tag_set_comment_latin1(lame_global_flags&, char const*, char const*,char const*);
#if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
#else
/* experimental */
//int id3tag_set_textinfo_ucs2(lame_global_flags & gfp, char const *id, unsigned short const *text);
/* experimental */
//int id3tag_set_comment_ucs2(lame_global_flags & gfp, char const *lang,
// unsigned short const *desc, unsigned short const *text);
/* experimental */
int id3tag_set_fieldvalue_ucs2(lame_global_flags & gfp, const unsigned short *fieldvalue);
#endif
/* experimental */
int id3tag_set_fieldvalue_utf16(lame_global_flags&, const unsigned short *fieldvalue);
/* experimental */
//int id3tag_set_textinfo_utf16(lame_global_flags&, char const *id, unsigned short const *text);
/* experimental */
int id3tag_set_comment_utf16(lame_global_flags&, char const *lang, unsigned short const *desc, unsigned short const *text);
/***********************************************************************
*
* list of valid bitrates [kbps] & sample frequencies [Hz].
* first index: 0: MPEG-2 values (sample frequencies 16...24 kHz)
* 1: MPEG-1 values (sample frequencies 32...48 kHz)
* 2: MPEG-2.5 values (sample frequencies 8...12 kHz)
***********************************************************************/
extern const int bitrate_table [3][16];
extern const int samplerate_table [3][ 4];
/* access functions for use in DLL, global vars are not exported */
int lame_get_bitrate(int mpeg_version, int table_index);
int lame_get_samplerate(int mpeg_version, int table_index);
/* maximum size of albumart image (128KB), which affects LAME_MAXMP3BUFFER
as well since lame_encode_buffer() also returns ID3v2 tag data */
#define LAME_MAXALBUMART (128 * 1024)
/* maximum size of mp3buffer needed if you encode at most 1152 samples for
each call to lame_encode_buffer. see lame_encode_buffer() below
(LAME_MAXMP3BUFFER is now obsolete) */
#define LAME_MAXMP3BUFFER (16384 + LAME_MAXALBUMART)
typedef enum {
LAME_OKAY = 0,
LAME_NOERROR = 0,
LAME_GENERICERROR = -1,
LAME_NOMEM = -10,
LAME_BADBITRATE = -11,
LAME_BADSAMPFREQ = -12,
LAME_INTERNALERROR = -13,
FRONTEND_READERROR = -80,
FRONTEND_WRITEERROR = -81,
FRONTEND_FILETOOLARGE = -82
} lame_errorcodes_t;
Detected encoding: ASCII (7 bit) | 2
|