DsfDecoderPlugin.cxx 10.2 KB
Newer Older
1
/*
Max Kellermann's avatar
Max Kellermann committed
2
 * Copyright (C) 2003-2015 The Music Player Daemon Project
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 * http://www.musicpd.org
 *
 * This program 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 of the License, or
 * (at your option) any later version.
 *
 * This program 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 this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

/* \file
 *
 * This plugin decodes DSDIFF data (SACD) embedded in DSF files.
 *
 * The DSF code was created using the specification found here:
 * http://dsd-guide.com/sonys-dsf-file-format-spec
 *
 * All functions common to both DSD decoders have been moved to dsdlib
 */

#include "config.h"
31
#include "DsfDecoderPlugin.hxx"
32
#include "../DecoderAPI.hxx"
Max Kellermann's avatar
Max Kellermann committed
33
#include "input/InputStream.hxx"
34
#include "CheckAudioFormat.hxx"
35
#include "util/bit_reverse.h"
36
#include "util/Error.hxx"
37
#include "system/ByteOrder.hxx"
38
#include "DsdLib.hxx"
39
#include "tag/TagHandler.hxx"
40
#include "Log.hxx"
41

42 43
#include <string.h>

44 45
static constexpr unsigned DSF_BLOCK_SIZE = 4096;

46
struct DsfMetaData {
47 48
	unsigned sample_rate, channels;
	bool bitreverse;
49
	offset_type n_blocks;
50
#ifdef ENABLE_ID3TAG
51
	offset_type id3_offset;
52
#endif
53 54
};

55
struct DsfHeader {
56
	/** DSF header id: "DSD " */
57
	DsdId id;
58
	/** DSD chunk size, including id = 28 */
59
	DsdUint64 size;
60
	/** total file size */
61
	DsdUint64 fsize;
62
	/** pointer to id3v2 metadata, should be at the end of the file */
63
	DsdUint64 pmeta;
64
};
65

66
/** DSF file fmt chunk */
67
struct DsfFmtChunk {
68
	/** id: "fmt " */
69
	DsdId id;
70
	/** fmt chunk size, including id, normally 52 */
71
	DsdUint64 size;
72 73 74 75 76 77 78 79 80 81 82 83 84
	/** version of this format = 1 */
	uint32_t version;
	/** 0: DSD raw */
	uint32_t formatid;
	/** channel type, 1 = mono, 2 = stereo, 3 = 3 channels, etc */
	uint32_t channeltype;
	/** Channel number, 1 = mono, 2 = stereo, ... 6 = 6 channels */
	uint32_t channelnum;
	/** sample frequency: 2822400, 5644800 */
	uint32_t sample_freq;
	/** bits per sample 1 or 8 */
	uint32_t bitssample;
	/** Sample count per channel in bytes */
85
	DsdUint64 scnt;
86 87 88 89 90 91
	/** block size per channel = 4096 */
	uint32_t block_size;
	/** reserved, should be all zero */
	uint32_t reserved;
};

92
struct DsfDataChunk {
93
	DsdId id;
94
	/** "data" chunk size, includes header (id+size) */
95
	DsdUint64 size;
96 97 98 99 100 101
};

/**
 * Read and parse all needed metadata chunks for DSF files.
 */
static bool
102
dsf_read_metadata(Decoder *decoder, InputStream &is,
103
		  DsfMetaData *metadata)
104
{
105
	DsfHeader dsf_header;
106
	if (!decoder_read_full(decoder, is, &dsf_header, sizeof(dsf_header)) ||
107
	    !dsf_header.id.Equals("DSD "))
108 109
		return false;

110
	const offset_type chunk_size = dsf_header.size.Read();
111 112 113
	if (sizeof(dsf_header) != chunk_size)
		return false;

114
#ifdef ENABLE_ID3TAG
115
	const offset_type metadata_offset = dsf_header.pmeta.Read();
116 117
#endif

118
	/* read the 'fmt ' chunk of the DSF file */
119
	DsfFmtChunk dsf_fmt_chunk;
120 121
	if (!decoder_read_full(decoder, is,
			       &dsf_fmt_chunk, sizeof(dsf_fmt_chunk)) ||
122
	    !dsf_fmt_chunk.id.Equals("fmt "))
123 124
		return false;

125
	const uint64_t fmt_chunk_size = dsf_fmt_chunk.size.Read();
126 127 128
	if (fmt_chunk_size != sizeof(dsf_fmt_chunk))
		return false;

129
	uint32_t samplefreq = FromLE32(dsf_fmt_chunk.sample_freq);
130
	const unsigned channels = FromLE32(dsf_fmt_chunk.channelnum);
131 132

	/* for now, only support version 1 of the standard, DSD raw stereo
133
	   files with a sample freq of 2822400 or 5644800 Hz */
134

135 136
	if (FromLE32(dsf_fmt_chunk.version) != 1 ||
	    FromLE32(dsf_fmt_chunk.formatid) != 0 ||
137
	    !audio_valid_channel_count(channels) ||
138
	    !dsdlib_valid_freq(samplefreq))
139 140
		return false;

141
	uint32_t chblksize = FromLE32(dsf_fmt_chunk.block_size);
142
	/* according to the spec block size should always be 4096 */
143
	if (chblksize != DSF_BLOCK_SIZE)
144 145 146
		return false;

	/* read the 'data' chunk of the DSF file */
147
	DsfDataChunk data_chunk;
148
	if (!decoder_read_full(decoder, is, &data_chunk, sizeof(data_chunk)) ||
149
	    !data_chunk.id.Equals("data"))
150 151 152 153 154
		return false;

	/* data size of DSF files are padded to multiple of 4096,
	   we use the actual data size as chunk size */

155
	offset_type data_size = data_chunk.size.Read();
156 157 158
	if (data_size < sizeof(data_chunk))
		return false;

159 160
	data_size -= sizeof(data_chunk);

161
	/* data_size cannot be bigger or equal to total file size */
162 163
	if (is.KnownSize() && data_size > is.GetRest())
		return false;
164

165 166 167 168
	/* use the sample count from the DSF header as the upper
	   bound, because some DSF files contain junk at the end of
	   the "data" chunk */
	const uint64_t samplecnt = dsf_fmt_chunk.scnt.Read();
169
	const offset_type playable_size = samplecnt * channels / 8;
170 171 172
	if (data_size > playable_size)
		data_size = playable_size;

173 174
	const size_t block_size = channels * DSF_BLOCK_SIZE;
	metadata->n_blocks = data_size / block_size;
175
	metadata->channels = channels;
176
	metadata->sample_rate = samplefreq;
177
#ifdef ENABLE_ID3TAG
178
	metadata->id3_offset = metadata_offset;
179
#endif
180
	/* check bits per sample format, determine if bitreverse is needed */
181
	metadata->bitreverse = FromLE32(dsf_fmt_chunk.bitssample) == 1;
182 183 184 185 186 187 188 189 190 191
	return true;
}

static void
bit_reverse_buffer(uint8_t *p, uint8_t *end)
{
	for (; p < end; ++p)
		*p = bit_reverse(*p);
}

192 193 194 195 196 197 198
static void
InterleaveDsfBlockMono(uint8_t *gcc_restrict dest,
		       const uint8_t *gcc_restrict src)
{
	memcpy(dest, src, DSF_BLOCK_SIZE);
}

199 200 201 202 203 204 205
/**
 * DSF data is build up of alternating 4096 blocks of DSD samples for left and
 * right. Convert the buffer holding 1 block of 4096 DSD left samples and 1
 * block of 4096 DSD right samples to 8k of samples in normal PCM left/right
 * order.
 */
static void
206 207
InterleaveDsfBlockStereo(uint8_t *gcc_restrict dest,
			 const uint8_t *gcc_restrict src)
208
{
209 210 211
	for (size_t i = 0; i < DSF_BLOCK_SIZE; ++i) {
		dest[2 * i] = src[i];
		dest[2 * i + 1] = src[DSF_BLOCK_SIZE + i];
212 213 214
	}
}

215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
static void
InterleaveDsfBlockChannel(uint8_t *gcc_restrict dest,
			  const uint8_t *gcc_restrict src,
			  unsigned channels)
{
	for (size_t i = 0; i < DSF_BLOCK_SIZE; ++i, dest += channels, ++src)
		*dest = *src;
}

static void
InterleaveDsfBlockGeneric(uint8_t *gcc_restrict dest,
			  const uint8_t *gcc_restrict src,
			  unsigned channels)
{
	for (unsigned c = 0; c < channels; ++c, ++dest, src += DSF_BLOCK_SIZE)
		InterleaveDsfBlockChannel(dest, src, channels);
}

static void
InterleaveDsfBlock(uint8_t *gcc_restrict dest, const uint8_t *gcc_restrict src,
		   unsigned channels)
{
	if (channels == 1)
		InterleaveDsfBlockMono(dest, src);
	else if (channels == 2)
		InterleaveDsfBlockStereo(dest, src);
	else
		InterleaveDsfBlockGeneric(dest, src, channels);
}

245
static offset_type
246
FrameToBlock(uint64_t frame)
247
{
248
	return frame / DSF_BLOCK_SIZE;
249 250
}

251 252 253 254
/**
 * Decode one complete DSF 'data' chunk i.e. a complete song
 */
static bool
255
dsf_decode_chunk(Decoder &decoder, InputStream &is,
256
		 unsigned channels, unsigned sample_rate,
257
		 offset_type n_blocks,
Max Kellermann's avatar
Max Kellermann committed
258
		 bool bitreverse)
259
{
260
	const size_t block_size = channels * DSF_BLOCK_SIZE;
261
	const offset_type start_offset = is.GetOffset();
262

263 264
	auto cmd = decoder_get_command(decoder);
	for (offset_type i = 0; i < n_blocks && cmd != DecoderCommand::STOP;) {
265
		if (cmd == DecoderCommand::SEEK) {
266 267
			uint64_t frame = decoder_seek_where_frame(decoder);
			offset_type block = FrameToBlock(frame);
268 269 270 271 272 273 274 275 276 277 278 279 280 281
			if (block >= n_blocks) {
				decoder_command_finished(decoder);
				break;
			}

			offset_type offset =
				start_offset + block * block_size;
			if (dsdlib_skip_to(&decoder, is, offset)) {
				decoder_command_finished(decoder);
				i = block;
			} else
				decoder_seek_error(decoder);
		}

282 283
		/* worst-case buffer size */
		uint8_t buffer[MAX_CHANNELS * DSF_BLOCK_SIZE];
284
		if (!decoder_read_full(&decoder, is, buffer, block_size))
285 286 287
			return false;

		if (bitreverse)
288
			bit_reverse_buffer(buffer, buffer + block_size);
289

290 291
		uint8_t interleaved_buffer[MAX_CHANNELS * DSF_BLOCK_SIZE];
		InterleaveDsfBlock(interleaved_buffer, buffer, channels);
292

293 294 295 296
		cmd = decoder_data(decoder, is,
				   interleaved_buffer, block_size,
				   sample_rate / 1000);
		++i;
297
	}
298

299
	return true;
300 301 302
}

static void
303
dsf_stream_decode(Decoder &decoder, InputStream &is)
304 305
{
	/* check if it is a proper DSF file */
306
	DsfMetaData metadata;
307
	if (!dsf_read_metadata(&decoder, is, &metadata))
308 309
		return;

310
	Error error;
311 312 313
	AudioFormat audio_format;
	if (!audio_format_init_checked(audio_format, metadata.sample_rate / 8,
				       SampleFormat::DSD,
314
				       metadata.channels, error)) {
315
		LogError(error);
316 317
		return;
	}
318
	/* Calculate song time from DSD chunk size and sample frequency */
319
	const auto n_blocks = metadata.n_blocks;
320 321
	auto songtime = SongTime::FromScale<uint64_t>(n_blocks * DSF_BLOCK_SIZE,
						      audio_format.sample_rate);
322 323

	/* success: file was recognized */
324
	decoder_initialized(decoder, audio_format, is.IsSeekable(), songtime);
325

326 327 328 329
	dsf_decode_chunk(decoder, is, metadata.channels,
			 metadata.sample_rate,
			 n_blocks,
			 metadata.bitreverse);
330 331 332
}

static bool
333
dsf_scan_stream(InputStream &is,
334 335
		gcc_unused const struct tag_handler *handler,
		gcc_unused void *handler_ctx)
336 337
{
	/* check DSF metadata */
338
	DsfMetaData metadata;
339
	if (!dsf_read_metadata(nullptr, is, &metadata))
340 341
		return false;

342 343 344
	AudioFormat audio_format;
	if (!audio_format_init_checked(audio_format, metadata.sample_rate / 8,
				       SampleFormat::DSD,
345
				       metadata.channels, IgnoreError()))
346 347 348
		/* refuse to parse files which we cannot play anyway */
		return false;

349
	/* calculate song time and add as tag */
350 351 352
	const auto n_blocks = metadata.n_blocks;
	auto songtime = SongTime::FromScale<uint64_t>(n_blocks * DSF_BLOCK_SIZE,
						      audio_format.sample_rate);
353 354
	tag_handler_invoke_duration(handler, handler_ctx, songtime);

355
#ifdef ENABLE_ID3TAG
356 357 358
	/* Add available tags from the ID3 tag */
	dsdlib_tag_id3(is, handler, handler_ctx, metadata.id3_offset);
#endif
359 360 361 362 363
	return true;
}

static const char *const dsf_suffixes[] = {
	"dsf",
364
	nullptr
365 366 367 368
};

static const char *const dsf_mime_types[] = {
	"application/x-dsf",
369
	nullptr
370 371
};

372
const struct DecoderPlugin dsf_decoder_plugin = {
373 374 375 376 377 378 379 380 381 382
	"dsf",
	nullptr,
	nullptr,
	dsf_stream_decode,
	nullptr,
	nullptr,
	dsf_scan_stream,
	nullptr,
	dsf_suffixes,
	dsf_mime_types,
383
};