diff options
| author | Michele Calgaro <michele.calgaro@yahoo.it> | 2020-09-11 14:38:47 +0900 |
|---|---|---|
| committer | Michele Calgaro <michele.calgaro@yahoo.it> | 2020-09-11 14:38:47 +0900 |
| commit | 884c8093d63402a1ad0b502244b791e3c6782be3 (patch) | |
| tree | a600d4ab0d431a2bdfe4c15b70df43c14fbd8dd0 /debian/transcode/transcode-1.1.7/import/decode_mp3.c | |
| parent | 14e1aa2006796f147f3f4811fb908a6b01e79253 (diff) | |
| download | extra-dependencies-884c8093d63402a1ad0b502244b791e3c6782be3.tar.gz extra-dependencies-884c8093d63402a1ad0b502244b791e3c6782be3.zip | |
Added debian extra dependency packages.
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
Diffstat (limited to 'debian/transcode/transcode-1.1.7/import/decode_mp3.c')
| -rw-r--r-- | debian/transcode/transcode-1.1.7/import/decode_mp3.c | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/import/decode_mp3.c b/debian/transcode/transcode-1.1.7/import/decode_mp3.c new file mode 100644 index 00000000..524e0490 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/import/decode_mp3.c @@ -0,0 +1,185 @@ +/* + * decode_mp3.c + * + * Copyright (C) Thomas Oestreich - June 2001 + * + * This file is part of transcode, a video stream processing tool + * + * transcode is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * transcode 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Make; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include <stdint.h> + +#include "transcode.h" +#include "libtc/libtc.h" +#include "tcinfo.h" + +#include "ioaux.h" +#include "tc.h" + +#ifdef HAVE_LAME + +#include "mpg123.h" + +#define MP3_PCM_SIZE 1152 +static uint16_t buffer[MP3_PCM_SIZE<<2]; +static uint16_t ch1[MP3_PCM_SIZE], ch2[MP3_PCM_SIZE]; + +#endif // HAVE_LAME + +#define MP3_AUDIO_ID 0x55 +#define MP2_AUDIO_ID 0x50 + +/* + * About MP2/3 handling differences: + * It is possible that lame_decode_initfile() when looking for an MP3 syncbyte + * finds an invalid one (esp. in broken mp3 streams). Thats why we use the + * format argument to decide which syncword detection is to be done. The + * syncword detection for mp2 also finds mp3 sync bytes but NOT the other way round. + */ + +/* ------------------------------------------------------------ + * + * decoder thread + * + * ------------------------------------------------------------*/ + + +static void decode_mpaudio(decode_t *decode, int format) +{ +#ifdef HAVE_LAME + int samples = 0, j, bytes, channels = 0, i, padding = 0; + int verbose; + + mp3data_struct *mp3data = NULL; + FILE *in_file = NULL; + + if (format != MP2_AUDIO_ID && format != MP3_AUDIO_ID) { + tc_log_error(__FILE__, "wrong mpeg audio format: 0x%x", format); + exit(1); + } + + verbose = decode->verbose; + + // init decoder + + mp3data = tc_zalloc(sizeof(mp3data_struct)); + if (mp3data == NULL) { + tc_log_error(__FILE__, "out of memory"); + exit(1); + } + + if (lame_decode_init() < 0) { + tc_log_error(__FILE__, "failed to init decoder"); + exit(1); + } + + in_file = fdopen(decode->fd_in, "r"); + + if (format == MP3_AUDIO_ID) { + int c = 0; + /* padding detection */ + while (!(c = fgetc(in_file))) + padding++; + if (c != EOF) + ungetc(c, in_file); + } + + samples = lame_decode_initfile(in_file, mp3data, format); + + if (verbose) { + tc_log_info(__FILE__, "channels=%d, samplerate=%d Hz, bitrate=%d kbps, (%d)", + mp3data->stereo, mp3data->samplerate, mp3data->bitrate, + mp3data->framesize); + } + + if (format == MP3_AUDIO_ID) { + if (decode->padrate > 0) { + padding = (int)((double)padding / (double)decode->padrate * mp3data->samplerate) + * mp3data->stereo * 2; + memset(buffer, 0, sizeof(buffer)); + while (padding >= sizeof(buffer)) { + if (tc_pwrite(decode->fd_out, (uint8_t *)buffer, sizeof(buffer)) != sizeof(buffer)) { + tc_log_error(__FILE__, "error while writing padding output data"); + import_exit(1); + } + padding -= sizeof(buffer); + } + if (padding && tc_pwrite(decode->fd_out, (uint8_t *)buffer, padding) != padding) { + tc_log_error(__FILE__, "error while writing final padding output data"); + import_exit(1); + } + } + } + + // decoder loop + channels = mp3data->stereo; + + while ((samples=lame_decode_fromfile(in_file, ch1, ch2, mp3data)) > 0) { + // interleave data + j = 0; + switch (channels) { + case 1: // mono + ac_memcpy (buffer, ch1, samples * sizeof(uint16_t)); + break; + case 2: // stereo + for (i=0; i < samples; i++) { + *(buffer+j+0) = ch1[i]; + *(buffer+j+1) = ch2[i]; + j+=2; + } + break; + } + + bytes = samples * channels * sizeof(uint16_t); + + if (tc_pwrite(decode->fd_out, (uint8_t *) buffer, bytes) != bytes) { + tc_log_error(__FILE__, "error while writing output data"); + import_exit(1); + break; /* broken pipe */ + } + } + + import_exit(0); + +#else // HAVE_LAME + tc_log_error(__FILE__, "no lame support available"); + import_exit(1); +#endif +} + +void decode_mp3(decode_t *decode) +{ + decode_mpaudio(decode, MP3_AUDIO_ID); +} + + +void decode_mp2(decode_t *decode) +{ + decode_mpaudio(decode, MP2_AUDIO_ID); +} + +/*************************************************************************/ + +/* + * Local variables: + * c-file-style: "stroustrup" + * c-file-offsets: ((case-label . *) (statement-case-intro . *)) + * indent-tabs-mode: nil + * End: + * + * vim: expandtab shiftwidth=4: + */ |
