Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/* -*- mode: C; mode: fold -*- */
2
/*
3
 * set/get functions for lame_global_flags
4
 *
5
 * Copyright (c) 2001 Alexander Leidinger
6
 *
7
 * This library is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Library General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2 of the License, or (at your option) any later version.
11
 *
12
 * This library is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Library General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Library General Public
18
 * License along with this library; if not, write to the
19
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20
 * Boston, MA 02111-1307, USA.
21
 */
22
 
23
/* $Id: set_get.c,v 1.2 2001/03/12 04:38:35 markt Exp $ */
24
 
25
#ifdef HAVE_CONFIG_H
26
# include <config.h>
27
#endif
28
 
29
#include <assert.h>
30
#include "lame.h"
31
 
32
#ifdef WITH_DMALLOC
33
#include <dmalloc.h>
34
#endif
35
 
36
 
37
/*
38
 * input stream description
39
 */
40
 
41
/* number of samples */
42
/* it's unlikely for this function to return an error */
43
int
44
lame_set_num_samples( lame_global_flags*  gfp,
45
                      unsigned long       num_samples)
46
{
47
    /* default = 2^32-1 */
48
 
49
    gfp->num_samples = num_samples;
50
 
51
    return 0;
52
}
53
 
54
unsigned long
55
lame_get_num_samples( const lame_global_flags* gfp )
56
{
57
    return gfp->num_samples;
58
}
59
 
60
 
61
/* input samplerate */
62
int
63
lame_set_in_samplerate( lame_global_flags*  gfp,
64
                        int                 in_samplerate )
65
{
66
    /* input sample rate in Hz,  default = 44100 Hz */
67
    gfp->in_samplerate = in_samplerate;
68
 
69
    return 0;
70
}
71
 
72
int
73
lame_get_in_samplerate( const lame_global_flags*  gfp )
74
{
75
    return gfp->in_samplerate;
76
}
77
 
78
 
79
/* number of channels in input stream */
80
int
81
lame_set_num_channels( lame_global_flags*  gfp,
82
                       int                 num_channels )
83
{
84
    /* default = 2 */
85
 
86
    if ( 2 < num_channels || 0 == num_channels )
87
        return -1;    /* we didn't support more than 2 channels */
88
 
89
    gfp->num_channels = num_channels;
90
 
91
    return 0;
92
}
93
 
94
int
95
lame_get_num_channels( const lame_global_flags*  gfp )
96
{
97
    return gfp->num_channels;
98
}
99
 
100
 
101
/* scale the input by this amount before encoding (not used for decoding) */
102
int
103
lame_set_scale( lame_global_flags*  gfp,
104
                float               scale )
105
{
106
    /* default = 0 */
107
    gfp->scale = scale;
108
 
109
    return 0;
110
}
111
 
112
float
113
lame_get_scale( const lame_global_flags*  gfp )
114
{
115
    return gfp->scale;
116
}
117
 
118
 
119
/* output sample rate in Hz */
120
int
121
lame_set_out_samplerate( lame_global_flags*  gfp,
122
                         int                 out_samplerate )
123
{
124
    /*
125
     * default = 0: LAME picks best value based on the amount
126
     *              of compression
127
     * MPEG only allows:
128
     *  MPEG1    32, 44.1,   48khz
129
     *  MPEG2    16, 22.05,  24
130
     *  MPEG2.5   8, 11.025, 12
131
     *
132
     * (not used by decoding routines)
133
     */
134
    gfp->out_samplerate = out_samplerate;
135
 
136
    return 0;
137
}
138
 
139
int
140
lame_get_out_samplerate( const lame_global_flags*  gfp )
141
{
142
    return gfp->out_samplerate;
143
}
144
 
145
 
146
 
147
 
148
/*
149
 * general control parameters
150
 */
151
 
152
/*collect data for an MP3 frame analzyer */
153
int
154
lame_set_analysis( lame_global_flags*  gfp,
155
                   int                 analysis )
156
{
157
    /* default = 0 */
158
 
159
    /* enforce disable/enable meaning, if we need more than two values
160
       we need to switch to an enum to have an apropriate representation
161
       of the possible meanings of the value */
162
    if ( 0 > analysis || 1 < analysis )
163
        return -1;
164
 
165
    gfp->analysis = analysis;
166
 
167
    return 0;
168
}
169
 
170
int
171
lame_get_analysis( const lame_global_flags*  gfp )
172
{
173
    assert( 0 <= gfp->analysis && 1 >= gfp->analysis );
174
 
175
    return gfp->analysis;
176
}
177
 
178
 
179
/* write a Xing VBR header frame */
180
int
181
lame_set_bWriteVbrTag( lame_global_flags*  gfp,
182
                       int bWriteVbrTag )
183
{
184
    /* default = 1 (on) for VBR/ABR modes, 0 (off) for CBR mode */
185
 
186
    /* enforce disable/enable meaning, if we need more than two values
187
       we need to switch to an enum to have an apropriate representation
188
       of the possible meanings of the value */
189
    if ( 0 > bWriteVbrTag || 1 < bWriteVbrTag )
190
        return -1;
191
 
192
    gfp->bWriteVbrTag = bWriteVbrTag;
193
 
194
    return 0;
195
}
196
 
197
int
198
lame_get_bWriteVbrTag( const lame_global_flags*  gfp )
199
{
200
    assert( 0 <= gfp->bWriteVbrTag && 1 >= gfp->bWriteVbrTag );
201
 
202
    return gfp->bWriteVbrTag;
203
}
204
 
205
 
206
/* disable writing a wave header with *decoding* */
207
int
208
lame_set_disable_waveheader( lame_global_flags*  gfp,
209
                             int                 disable_waveheader )
210
{
211
    /* default = 0 (disabled) */
212
 
213
    /* enforce disable/enable meaning, if we need more than two values
214
       we need to switch to an enum to have an apropriate representation
215
       of the possible meanings of the value */
216
    if ( 0 > disable_waveheader || 1 < disable_waveheader )
217
        return -1;
218
 
219
    gfp->disable_waveheader = disable_waveheader;
220
 
221
    return 0;
222
}
223
 
224
int
225
lame_get_disable_waveheader( const lame_global_flags*  gfp )
226
{
227
    assert( 0 <= gfp->disable_waveheader && 1 >= gfp->disable_waveheader );
228
 
229
    return gfp->disable_waveheader;
230
}
231
 
232
 
233
/* decode only, use lame/mpglib to convert mp3/ogg to wav */
234
int
235
lame_set_decode_only( lame_global_flags*  gfp,
236
                      int                 decode_only )
237
{
238
    /* default = 0 (disabled) */
239
 
240
    /* enforce disable/enable meaning, if we need more than two values
241
       we need to switch to an enum to have an apropriate representation
242
       of the possible meanings of the value */
243
    if ( 0 > decode_only || 1 < decode_only )
244
        return -1;
245
 
246
    gfp->decode_only = decode_only;
247
 
248
    return 0;
249
}
250
 
251
int
252
lame_get_decode_only( const lame_global_flags*  gfp )
253
{
254
    assert( 0 <= gfp->decode_only && 1 >= gfp->decode_only );
255
 
256
    return gfp->decode_only;
257
}
258
 
259
 
260
/* encode a Vorbis .ogg file */
261
int
262
lame_set_ogg( lame_global_flags*  gfp,
263
              int                 ogg )
264
{
265
    /* default = 0 (disabled) */
266
 
267
    /* enforce disable/enable meaning, if we need more than two values
268
       we need to switch to an enum to have an apropriate representation
269
       of the possible meanings of the value */
270
    if ( 0 > ogg || 1 < ogg )
271
        return -1;
272
 
273
    gfp->ogg = ogg;
274
 
275
    return 0;
276
}
277
 
278
int
279
lame_get_ogg( const lame_global_flags*  gfp )
280
{
281
    assert( 0 <= gfp->ogg && 1 >= gfp->ogg );
282
 
283
    return gfp->ogg;
284
}
285
 
286
 
287
/*
288
 * Internal algorithm selection.
289
 * True quality is determined by the bitrate but this variable will effect
290
 * quality by selecting expensive or cheap algorithms.
291
 * quality=0..9.  0=best (very slow).  9=worst.  
292
 * recommended:  2     near-best quality, not too slow
293
 *               5     good quality, fast
294
 *               7     ok quality, really fast
295
 */
296
int
297
lame_set_quality( lame_global_flags*  gfp,
298
                  int                 quality )
299
{
300
    gfp->quality = quality;
301
 
302
    return 0;
303
}
304
 
305
int
306
lame_get_quality( const lame_global_flags*  gfp )
307
{
308
    return gfp->quality;
309
}
310
 
311
 
312
/* mode = STEREO, JOINT_STEREO, DUAL_CHANNEL (not supported), MONO */
313
int
314
lame_set_mode( lame_global_flags*  gfp,
315
               MPEG_mode           mode )
316
{
317
    /* default: lame chooses based on compression ratio and input channels */
318
 
319
    if( 0 > mode || MAX_INDICATOR <= mode )
320
        return -1;  /* Unknown MPEG mode! */
321
 
322
    gfp->mode = mode;
323
 
324
    return 0;
325
}
326
 
327
MPEG_mode
328
lame_get_mode( const lame_global_flags*  gfp )
329
{
330
    assert( 0 <= gfp->mode && MAX_INDICATOR > gfp->mode );
331
 
332
    return gfp->mode;
333
}
334
 
335
 
336
/* Us a M/S mode with a switching threshold based on compression ratio */
337
int
338
lame_set_mode_automs( lame_global_flags*  gfp,
339
                      int                 mode_automs )
340
{
341
    /* default = 0 (disabled) */
342
 
343
    /* enforce disable/enable meaning, if we need more than two values
344
       we need to switch to an enum to have an apropriate representation
345
       of the possible meanings of the value */
346
    if ( 0 > mode_automs || 1 < mode_automs )
347
        return -1;
348
 
349
    gfp->mode_automs = mode_automs;
350
 
351
    return 0;
352
}
353
 
354
int
355
lame_get_mode_automs( const lame_global_flags*  gfp )
356
{
357
    assert( 0 <= gfp->mode_automs && 1 >= gfp->mode_automs );
358
 
359
    return gfp->mode_automs;
360
}
361
 
362
 
363
// force_ms.  Force M/S for all frames.  For testing only.
364
// default = 0 (disabled)
365
int
366
lame_set_force_ms( lame_global_flags*  gfp,
367
                   int                 force_ms );
368
int
369
lame_get_force_ms( const lame_global_flags*  gfp );
370
 
371
 
372
// use free_format?  default = 0 (disabled)
373
int
374
lame_set_free_format( lame_global_flags*  gfp,
375
                      int                 free_format );
376
int
377
lame_get_free_format( const lame_global_flags*  gfp );
378
 
379
 
380
/* message handlers */
381
int
382
lame_set_errorf( lame_global_flags*  gfp,
383
                 void                (*func)( const char*, va_list ) )
384
{
385
    gfp->report.errorf = func;
386
 
387
    return 0;
388
}
389
 
390
int
391
lame_set_debugf( lame_global_flags*  gfp,
392
                 void                (*func)( const char*, va_list ) )
393
{
394
    gfp->report.debugf = func;
395
 
396
    return 0;
397
}
398
 
399
int
400
lame_set_msgf( lame_global_flags*  gfp,
401
               void                (*func)( const char *, va_list ) )
402
{
403
    gfp->report.msgf = func;
404
 
405
    return 0;
406
}
407
 
408
 
409
/* set one of brate compression ratio.  default is compression ratio of 11.  */
410
int
411
lame_set_brate( lame_global_flags*  gfp,
412
                int                 brate );
413
int
414
lame_get_brate( const lame_global_flags*  gfp );
415
int
416
lame_set_compression_ratio( lame_global_flags*  gfp,
417
                            float               compression_ratio );
418
float
419
lame_get_compression_ratio( const lame_global_flags*  gfp );
420
 
421
 
422
 
423
 
424
/*
425
 * frame parameters
426
 */
427
 
428
// mark as copyright.  default=0
429
int
430
lame_set_copyright( lame_global_flags*  gfp,
431
                    int                 copyright );
432
int
433
lame_get_copyright( const lame_global_flags*  gfp );
434
 
435
 
436
// mark as original.  default=1
437
int
438
lame_set_original( lame_global_flags*  gfp,
439
                   int                 original );
440
int
441
lame_get_original( const lame_global_flags*  gfp );
442
 
443
 
444
// error_protection.  Use 2 bytes from each fraome for CRC checksum. default=0
445
int
446
lame_set_error_protection( lame_global_flags*  gfp,
447
                           int                 error_protection );
448
int
449
lame_get_error_protection( const lame_global_flags*  gfp );
450
 
451
 
452
// padding_type.  0=pad no frames  1=pad all frames 2=adjust padding(default)
453
int
454
lame_set_padding_type( lame_global_flags*  gfp,
455
                       int                 padding_type );
456
int
457
lame_get_padding_type( const lame_global_flags*  gfp );
458
 
459
 
460
// MP3 'private extension' bit  Meaningless
461
int
462
lame_set_extension( lame_global_flags*  gfp,
463
                    int                 extension );
464
int
465
lame_get_extension( const lame_global_flags*  gfp );
466
 
467
 
468
// enforce strict ISO compliance.  default=0
469
int
470
lame_set_strict_ISO( lame_global_flags*  gfp,
471
                     int                 strict_ISO );
472
int
473
lame_get_strict_ISO( const lame_global_flags*  gfp );
474
 
475
 
476
 
477
 
478
/********************************************************************
479
 * quantization/noise shaping 
480
 ***********************************************************************/
481
 
482
// disable the bit reservoir. For testing only. default=0
483
int
484
lame_set_disable_reservoir( lame_global_flags*  gfp,
485
                            int                 disable_reservoir );
486
int
487
lame_get_disable_reservoir( const lame_global_flags*  gfp );
488
 
489
 
490
// select a different "best quantization" function. default=0 
491
int
492
lame_set_experimentalX( lame_global_flags*  gfp,
493
                        int                 experimentalX );
494
int
495
lame_get_experimentalX( const lame_global_flags*  gfp );
496
 
497
 
498
// another experimental option.  for testing only
499
int
500
lame_set_experimentalY( lame_global_flags*  gfp,
501
                        int                 experimentalY );
502
int
503
lame_get_experimentalY( const lame_global_flags*  gfp );
504
 
505
 
506
// another experimental option.  for testing only
507
int
508
lame_set_experimentalZ( lame_global_flags*  gfp,
509
                        int                 experimentalZ );
510
int
511
lame_get_experimentalZ( const lame_global_flags*  gfp );
512
 
513
 
514
// Naoki's psycho acoustic model.  default=0
515
int
516
lame_set_exp_nspsytune( lame_global_flags*  gfp,
517
                        int                 exp_nspsytune );
518
int
519
lame_get_exp_nspsytune( const lame_global_flags*  gfp );
520
 
521
 
522
 
523
 
524
/********************************************************************
525
 * VBR control
526
 ***********************************************************************/
527
 
528
// Types of VBR.  default = vbr_off = CBR
529
int
530
lame_set_VBR( lame_global_flags*  gfp,
531
              vbr_mode            VBR );
532
vbr_mode
533
lame_get_exp_VBR( const lame_global_flags*  gfp );
534
 
535
 
536
// VBR quality level.  0=highest  9=lowest 
537
int
538
lame_set_VBR_q( lame_global_flags*  gfp,
539
                int                 VBR_q );
540
int
541
lame_get_VBR_q( const lame_global_flags*  gfp );
542
 
543
 
544
// Ignored except for VBR=vbr_abr (ABR mode)
545
int
546
lame_set_VBR_mean_bitrate_kbps( lame_global_flags*  gfp,
547
                                int                 VBR_mean_bitrate_kbps );
548
int
549
lame_get_VBR_mean_bitrate_kbps( const lame_global_flags*  gfp );
550
 
551
int
552
lame_set_VBR_min_bitrate_kbps( lame_global_flags*  gfp,
553
                               int                 VBR_min_bitrate_kbps );
554
int
555
lame_get_VBR_min_bitrate_kbps( const lame_global_flags*  gfp );
556
 
557
int
558
lame_set_VBR_max_bitrate_kbps( lame_global_flags*  gfp,
559
                               int                 VBR_max_bitrate_kbps );
560
int
561
lame_get_VBR_max_bitrate_kbps( const lame_global_flags*  gfp );
562
 
563
 
564
// 1=stricetly enforce VBR_min_bitrate.  Normally it will be violated for
565
// analog silence
566
int
567
lame_set_VBR_hard_min( lame_global_flags*  gfp,
568
                       int                 VBR_hard_min );
569
int
570
lame_get_VBR_hard_min( const lame_global_flags*  gfp );
571
 
572
 
573
/********************************************************************
574
 * Filtering control
575
 ***********************************************************************/
576
 
577
// freq in Hz to apply lowpass. Default = 0 = lame chooses.  -1 = disabled
578
int
579
lame_set_lowpassfreq( lame_global_flags*  gfp,
580
                      int                 lowpassfreq );
581
int
582
lame_get_lowpassfreq( const lame_global_flags*  gfp );
583
 
584
 
585
// width of transition band, in Hz.  Default = one polyphase filter band
586
int
587
lame_set_lowpasswidth( lame_global_flags*  gfp,
588
                       int                 lowpasswidth );
589
int
590
lame_get_lowpasswidth( const lame_global_flags*  gfp );
591
 
592
 
593
// freq in Hz to apply highpass. Default = 0 = lame chooses.  -1 = disabled
594
int
595
lame_set_highpassfreq( lame_global_flags*  gfp,
596
                       int                 highpassfreq );
597
int
598
lame_get_highpassfreq( const lame_global_flags*  gfp );
599
 
600
 
601
// width of transition band, in Hz.  Default = one polyphase filter band
602
int
603
lame_set_highpasswidth( lame_global_flags*  gfp,
604
                        int                 highpasswidth );
605
int
606
lame_get_highpasswidth( const lame_global_flags*  gfp );
607
 
608
 
609
 
610
 
611
/*
612
 * psycho acoustics and other arguments which you should not change 
613
 * unless you know what you are doing
614
 */
615
 
616
// only use ATH for masking
617
int
618
lame_set_ATHonly( lame_global_flags*  gfp,
619
                  int                 ATHonly );
620
int
621
lame_get_ATHonly( const lame_global_flags*  gfp );
622
 
623
 
624
// only use ATH for short blocks
625
int
626
lame_set_ATHshort( lame_global_flags*  gfp,
627
                   int                 ATHshort );
628
int
629
lame_get_ATHshort( const lame_global_flags*  gfp );
630
 
631
 
632
// disable ATH
633
int
634
lame_set_noATH( lame_global_flags*  gfp,
635
                int                 noATH );
636
int
637
lame_get_noATH( const lame_global_flags*  gfp );
638
 
639
 
640
// select ATH formula
641
int
642
lame_set_ATHtype( lame_global_flags*  gfp,
643
                  int                 ATHtype );
644
int
645
lame_get_ATHtype( const lame_global_flags*  gfp );
646
 
647
 
648
// lower ATH by this many db
649
int
650
lame_set_ATHlower( lame_global_flags*  gfp,
651
                   float               ATHlower );
652
float
653
lame_get_ATHlower( const lame_global_flags*  gfp );
654
 
655
 
656
// predictability limit (ISO tonality formula)
657
int
658
lame_set_cwlimit( lame_global_flags*  gfp,
659
                  int                 cwlimit );
660
int
661
lame_get_cwlimit( const lame_global_flags*  gfp );
662
 
663
 
664
// allow blocktypes to differ between channels?
665
// default: 0 for jstereo, 1 for stereo
666
int
667
lame_set_allow_diff_short( lame_global_flags*  gfp,
668
                           int                 allow_diff_short );
669
int
670
lame_get_allow_diff_short( const lame_global_flags*  gfp );
671
 
672
 
673
// use temporal masking effect (default = 1)
674
int
675
lame_set_useTemporal( lame_global_flags*  gfp,
676
                      int                 useTemporal );
677
int
678
lame_get_useTemporal( const lame_global_flags*  gfp );
679
 
680
 
681
// disable short blocks
682
int
683
lame_set_no_short_blocks( lame_global_flags*  gfp,
684
                          int                 no_short_blocks );
685
int
686
lame_get_no_short_blocks( const lame_global_flags*  gfp );
687
 
688
 
689
/* Input PCM is emphased PCM (for instance from one of the rarely
690
   emphased CDs), it is STRONGLY not recommended to use this, because
691
   psycho does not take it into account, and last but not least many decoders
692
   ignore these bits */
693
int
694
lame_set_emphasis( lame_global_flags*  gfp,
695
                   int                 emphasis );
696
int
697
lame_get_emphasis( const lame_global_flags*  gfp );
698
 
699
 
700
 
701
 
702
/***************************************************************/
703
/* internal variables, cannot be set...                        */
704
/* provided because they may be of use to calling application  */
705
/***************************************************************/
706
 
707
// version  0=MPEG-2  1=MPEG-1  (2=MPEG-2.5)    
708
int
709
lame_get_version( const lame_global_flags* gfp );
710
 
711
 
712
// encoder delay
713
int
714
lame_get_encoder_delay( const lame_global_flags*  gfp );
715
 
716
 
717
// size of MPEG frame
718
int
719
lame_get_framesize( const lame_global_flags*  gfp );
720
 
721
 
722
// number of frames encoded so far
723
int
724
lame_get_frameNum( const lame_global_flags*  gfp );
725
 
726
 
727
// lame's estimate of the total number of frames to be encoded
728
// only valid if calling program set num_samples 
729
int
730
lame_get_totalframes( const lame_global_flags*  gfp );