blob: 9ffcba80a632376b65017bb09c4e899e8b152000 [file] [log] [blame]
/*
* Xing VBR tagging for LAME.
*
* Copyright (c) 1999 A.L. Faber
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef VRBTAG_H_INCLUDED
#define VRBTAG_H_INCLUDED
/* -----------------------------------------------------------
* A Vbr header may be present in the ancillary
* data field of the first frame of an mp3 bitstream
* The Vbr header (optionally) contains
* frames total number of audio frames in the bitstream
* bytes total number of bytes in the bitstream
* toc table of contents
* toc (table of contents) gives seek points
* for random access
* the ith entry determines the seek point for
* i-percent duration
* seek point in bytes = (toc[i]/256.0) * total_bitstream_bytes
* e.g. half duration seek point = (toc[50]/256.0) * total_bitstream_bytes
*/
#include "l3bitstream.h"
#define FRAMES_FLAG 0x0001
#define BYTES_FLAG 0x0002
#define TOC_FLAG 0x0004
#define VBR_SCALE_FLAG 0x0008
#define NUMTOCENTRIES 100
#define FRAMES_AND_BYTES (FRAMES_FLAG | BYTES_FLAG)
/*structure to receive extracted header */
/* toc may be NULL*/
typedef struct
{
int h_id; /* from MPEG header, 0=MPEG2, 1=MPEG1 */
int samprate; /* determined from MPEG header */
int flags; /* from Vbr header data */
int frames; /* total bit stream frames from Vbr header data */
int bytes; /* total bit stream bytes from Vbr header data*/
int vbr_scale; /* encoded vbr scale from Vbr header data*/
u_char toc[NUMTOCENTRIES]; /* may be NULL if toc not desired*/
} VBRTAGDATA;
/*
// 4 bytes for Header Tag
// 4 bytes for Header Flags
// 100 bytes for entry (NUMTOCENTRIES)
// 4 bytes for FRAME SIZE
// 4 bytes for STREAM_SIZE
// 4 bytes for VBR SCALE. a VBR quality indicator: 0=best 100=worst
// 20 bytes for LAME tag. for example, "LAME3.12 (beta 6)"
// ___________
// 140 bytes
*/
#define VBRHEADERSIZE (NUMTOCENTRIES+4+4+4+4+4)
int CheckVbrTag(unsigned char *buf);
int GetVbrTag(VBRTAGDATA *pTagData, unsigned char *buf);
int SeekPoint(unsigned char TOC[NUMTOCENTRIES], int file_bytes, float percent);
int InitVbrTag(Bit_stream_struc* pBs,int nVersion,int nMode, int SampIndex);
int PutVbrTag(char* lpszFileName,int nVbrScale,int nVersion);
void AddVbrFrame(int nStreamPos);
#endif