Commit 8079d2ec authored by Anssi Hannula's avatar Anssi Hannula Committed by Carl Eugen Hoyos

Move code to be used by the IEC 61937 demuxer from spifenc.c into common

files spdif.h and spdif.c.

Patch by Anssi Hannula, anssi d hannula a iki d fi

Originally committed as revision 25715 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent fe655f67
......@@ -256,7 +256,7 @@ OBJS-$(CONFIG_SMACKER_DEMUXER) += smacker.o
OBJS-$(CONFIG_SOL_DEMUXER) += sol.o pcm.o
OBJS-$(CONFIG_SOX_DEMUXER) += soxdec.o pcm.o
OBJS-$(CONFIG_SOX_MUXER) += soxenc.o
OBJS-$(CONFIG_SPDIF_MUXER) += spdifenc.o
OBJS-$(CONFIG_SPDIF_MUXER) += spdif.o spdifenc.o
OBJS-$(CONFIG_SRT_DEMUXER) += srtdec.o
OBJS-$(CONFIG_SRT_MUXER) += rawenc.o
OBJS-$(CONFIG_STR_DEMUXER) += psxstr.o
......
/*
* IEC 61937 common code
* Copyright (c) 2009 Bartlomiej Wolowiec
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "spdif.h"
#include "libavutil/bswap.h"
//TODO move to DSP
void ff_spdif_bswap_buf16(uint16_t *dst, const uint16_t *src, int w)
{
int i;
for (i = 0; i + 8 <= w; i += 8) {
dst[i + 0] = av_bswap16(src[i + 0]);
dst[i + 1] = av_bswap16(src[i + 1]);
dst[i + 2] = av_bswap16(src[i + 2]);
dst[i + 3] = av_bswap16(src[i + 3]);
dst[i + 4] = av_bswap16(src[i + 4]);
dst[i + 5] = av_bswap16(src[i + 5]);
dst[i + 6] = av_bswap16(src[i + 6]);
dst[i + 7] = av_bswap16(src[i + 7]);
}
for (; i < w; i++)
dst[i + 0] = av_bswap16(src[i + 0]);
}
/*
* IEC 61937 common header
* Copyright (c) 2009 Bartlomiej Wolowiec
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdint.h>
#define SYNCWORD1 0xF872
#define SYNCWORD2 0x4E1F
#define BURST_HEADER_SIZE 0x8
enum IEC958DataType {
IEC958_AC3 = 0x01, ///< AC-3 data
IEC958_MPEG1_LAYER1 = 0x04, ///< MPEG-1 layer 1
IEC958_MPEG1_LAYER23 = 0x05, ///< MPEG-1 layer 2 or 3 data or MPEG-2 without extension
IEC958_MPEG2_EXT = 0x06, ///< MPEG-2 data with extension
IEC958_MPEG2_AAC = 0x07, ///< MPEG-2 AAC ADTS
IEC958_MPEG2_LAYER1_LSF = 0x08, ///< MPEG-2, layer-1 low sampling frequency
IEC958_MPEG2_LAYER2_LSF = 0x09, ///< MPEG-2, layer-2 low sampling frequency
IEC958_MPEG2_LAYER3_LSF = 0x0A, ///< MPEG-2, layer-3 low sampling frequency
IEC958_DTS1 = 0x0B, ///< DTS type I (512 samples)
IEC958_DTS2 = 0x0C, ///< DTS type II (1024 samples)
IEC958_DTS3 = 0x0D, ///< DTS type III (2048 samples)
IEC958_ATRAC = 0x0E, ///< Atrac data
IEC958_ATRAC3 = 0x0F, ///< Atrac 3 data
IEC958_ATRACX = 0x10, ///< Atrac 3 plus data
IEC958_DTSHD = 0x11, ///< DTS HD data
IEC958_WMAPRO = 0x12, ///< WMA 9 Professional data
IEC958_MPEG2_AAC_LSF_2048 = 0x13, ///< MPEG-2 AAC ADTS half-rate low sampling frequency
IEC958_MPEG2_AAC_LSF_4096 = 0x13 | 0x20, ///< MPEG-2 AAC ADTS quarter-rate low sampling frequency
IEC958_EAC3 = 0x15, ///< E-AC-3 data
IEC958_TRUEHD = 0x16, ///< TrueHD data
};
static const uint16_t spdif_mpeg_pkt_offset[2][3] = {
//LAYER1 LAYER2 LAYER3
{ 3072, 9216, 4608 }, // MPEG2 LSF
{ 1536, 4608, 4608 }, // MPEG1
};
void ff_spdif_bswap_buf16(uint16_t *dst, const uint16_t *src, int w);
......@@ -41,37 +41,11 @@
*/
#include "avformat.h"
#include "spdif.h"
#include "libavcodec/ac3.h"
#include "libavcodec/dca.h"
#include "libavcodec/aacadtsdec.h"
#define SYNCWORD1 0xF872
#define SYNCWORD2 0x4E1F
#define BURST_HEADER_SIZE 0x8
enum IEC958DataType {
IEC958_AC3 = 0x01, ///< AC-3 data
IEC958_MPEG1_LAYER1 = 0x04, ///< MPEG-1 layer 1
IEC958_MPEG1_LAYER23 = 0x05, ///< MPEG-1 layer 2 or 3 data or MPEG-2 without extension
IEC958_MPEG2_EXT = 0x06, ///< MPEG-2 data with extension
IEC958_MPEG2_AAC = 0x07, ///< MPEG-2 AAC ADTS
IEC958_MPEG2_LAYER1_LSF = 0x08, ///< MPEG-2, layer-1 low sampling frequency
IEC958_MPEG2_LAYER2_LSF = 0x09, ///< MPEG-2, layer-2 low sampling frequency
IEC958_MPEG2_LAYER3_LSF = 0x0A, ///< MPEG-2, layer-3 low sampling frequency
IEC958_DTS1 = 0x0B, ///< DTS type I (512 samples)
IEC958_DTS2 = 0x0C, ///< DTS type II (1024 samples)
IEC958_DTS3 = 0x0D, ///< DTS type III (2048 samples)
IEC958_ATRAC = 0x0E, ///< Atrac data
IEC958_ATRAC3 = 0x0F, ///< Atrac 3 data
IEC958_ATRACX = 0x10, ///< Atrac 3 plus data
IEC958_DTSHD = 0x11, ///< DTS HD data
IEC958_WMAPRO = 0x12, ///< WMA 9 Professional data
IEC958_MPEG2_AAC_LSF_2048 = 0x13, ///< MPEG-2 AAC ADTS half-rate low sampling frequency
IEC958_MPEG2_AAC_LSF_4096 = 0x13 | 0x20, ///< MPEG-2 AAC ADTS quarter-rate low sampling frequency
IEC958_EAC3 = 0x15, ///< E-AC-3 data
IEC958_TRUEHD = 0x16, ///< TrueHD data
};
typedef struct IEC958Context {
enum IEC958DataType data_type; ///< burst info - reference to type of payload of the data-burst
int pkt_size; ///< length code in bits
......@@ -84,24 +58,6 @@ typedef struct IEC958Context {
int (*header_info) (AVFormatContext *s, AVPacket *pkt);
} IEC958Context;
//TODO move to DSP
static void bswap_buf16(uint16_t *dst, const uint16_t *src, int w)
{
int i;
for (i = 0; i + 8 <= w; i += 8) {
dst[i + 0] = av_bswap16(src[i + 0]);
dst[i + 1] = av_bswap16(src[i + 1]);
dst[i + 2] = av_bswap16(src[i + 2]);
dst[i + 3] = av_bswap16(src[i + 3]);
dst[i + 4] = av_bswap16(src[i + 4]);
dst[i + 5] = av_bswap16(src[i + 5]);
dst[i + 6] = av_bswap16(src[i + 6]);
dst[i + 7] = av_bswap16(src[i + 7]);
}
for (; i < w; i++)
dst[i + 0] = av_bswap16(src[i + 0]);
}
static int spdif_header_ac3(AVFormatContext *s, AVPacket *pkt)
{
......@@ -159,12 +115,6 @@ static const enum IEC958DataType mpeg_data_type[2][3] = {
{ IEC958_MPEG1_LAYER1, IEC958_MPEG1_LAYER23, IEC958_MPEG1_LAYER23 }, //MPEG1
};
static const uint16_t mpeg_pkt_offset[2][3] = {
//LAYER1 LAYER2 LAYER3
{ 3072, 9216, 4608 }, // MPEG2 LSF
{ 1536, 4608, 4608 }, // MPEG1
};
static int spdif_header_mpeg(AVFormatContext *s, AVPacket *pkt)
{
IEC958Context *ctx = s->priv_data;
......@@ -182,7 +132,7 @@ static int spdif_header_mpeg(AVFormatContext *s, AVPacket *pkt)
ctx->pkt_offset = 4608;
} else {
ctx->data_type = mpeg_data_type [version & 1][layer];
ctx->pkt_offset = mpeg_pkt_offset[version & 1][layer];
ctx->pkt_offset = spdif_mpeg_pkt_offset[version & 1][layer];
}
// TODO Data type dependant info (normal/karaoke, dynamic range control)
return 0;
......@@ -282,7 +232,7 @@ static int spdif_write_packet(struct AVFormatContext *s, AVPacket *pkt)
av_fast_malloc(&ctx->buffer, &ctx->buffer_size, pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
if (!ctx->buffer)
return AVERROR(ENOMEM);
bswap_buf16((uint16_t *)ctx->buffer, (uint16_t *)pkt->data, pkt->size >> 1);
ff_spdif_bswap_buf16((uint16_t *)ctx->buffer, (uint16_t *)pkt->data, pkt->size >> 1);
put_buffer(s->pb, ctx->buffer, pkt->size & ~1);
#endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment