/*
 * @(#)PCMAudioCodec.java  
 * 
 * Copyright (c) 2011 Werner Randelshofer, Immensee, Switzerland.
 * All rights reserved.
 * 
 * You may not use, copy or modify this file, except in compliance with the
 * license agreement you entered into with Werner Randelshofer.
 * For details see accompanying license terms.
 */
package org.monte.media.quicktime;

import org.monte.media.audio.*;
import org.monte.media.Format;
import java.nio.ByteOrder;
import java.util.Arrays;
import java.util.HashSet;
import static org.monte.media.FormatKeys.*;
import static org.monte.media.AudioFormatKeys.*;

/**
 * {@code PCMAudioCodec} performs sign conversion, endian conversion and
 * quantization conversion of PCM audio data.
 * <p>
 * Does not perform sampling rate conversion or channel conversion.
 *
 * @author Werner Randelshofer
 * @version $Id: QuickTimePCMAudioCodec.java 155 2012-01-13 23:09:45Z werner $
 */
public class QuickTimePCMAudioCodec extends PCMAudioCodec {

    private final static HashSet<String> signedEncodings = new HashSet<String>(
            Arrays.asList(new String[]{
                ENCODING_PCM_SIGNED, ENCODING_QUICKTIME_TWOS_PCM, ENCODING_QUICKTIME_SOWT_PCM,
                ENCODING_QUICKTIME_IN24_PCM, ENCODING_QUICKTIME_IN32_PCM,}));
    private final static HashSet<String> unsignedEncodings = new HashSet<String>(
            Arrays.asList(new String[]{
                ENCODING_PCM_UNSIGNED, ENCODING_QUICKTIME_RAW_PCM}));

    public QuickTimePCMAudioCodec() {
        super(new Format[]{
                    new Format(MediaTypeKey, MediaType.AUDIO,//
                    MimeTypeKey, MIME_JAVA,//
                    EncodingKey, ENCODING_PCM_SIGNED,
                    SignedKey, true),//
                    new Format(MediaTypeKey, MediaType.AUDIO,//
                    MimeTypeKey, MIME_JAVA,//
                    EncodingKey, ENCODING_PCM_UNSIGNED,
                    SignedKey, false),//
                    //
                    // 8-bit unsigned has "raw " encoding regardless of endian
                    new Format(MediaTypeKey, MediaType.AUDIO,//
                    EncodingKey, ENCODING_QUICKTIME_RAW_PCM,//
                    MimeTypeKey, MIME_QUICKTIME,//
                    SignedKey, false, SampleSizeInBitsKey, 8),//
                    //
                    // 8-bit signed has "sowt" encoding for little endian
                    new Format(MediaTypeKey, MediaType.AUDIO, //
                    EncodingKey, ENCODING_QUICKTIME_SOWT_PCM,//
                    MimeTypeKey, MIME_QUICKTIME,//
                    ByteOrderKey, ByteOrder.LITTLE_ENDIAN,
                    SignedKey, true, SampleSizeInBitsKey, 8),//
                    //
                    // 8-bit signed has "twos" encoding for big endian
                    new Format(MediaTypeKey, MediaType.AUDIO, //
                    EncodingKey, ENCODING_QUICKTIME_TWOS_PCM,//
                    MimeTypeKey, MIME_QUICKTIME,//
                    ByteOrderKey, ByteOrder.BIG_ENDIAN,
                    SignedKey, true, SampleSizeInBitsKey, 8),//

                    // 16-bit, signed, little endian
                    new Format(MediaTypeKey, MediaType.AUDIO, 
                    EncodingKey, ENCODING_QUICKTIME_SOWT_PCM,//
                    MimeTypeKey, MIME_QUICKTIME,//
                    ByteOrderKey, ByteOrder.LITTLE_ENDIAN,
                    SignedKey, true,
                    SampleSizeInBitsKey, 16),//
                    //
                    // 16-bit, signed, big endian
                    new Format(MediaTypeKey, MediaType.AUDIO, //
                    EncodingKey, ENCODING_QUICKTIME_TWOS_PCM,//
                    MimeTypeKey, MIME_QUICKTIME,//
                    ByteOrderKey, ByteOrder.BIG_ENDIAN,
                    SignedKey, true,
                    SampleSizeInBitsKey, 16),//
                    //
                    new Format(MediaTypeKey, MediaType.AUDIO, //
                    EncodingKey, ENCODING_QUICKTIME_IN24_PCM,//
                    MimeTypeKey, MIME_QUICKTIME,//
                    ByteOrderKey, ByteOrder.BIG_ENDIAN,
                    SignedKey, true, SampleSizeInBitsKey, 24),//
                    //
                    new Format(MediaTypeKey, MediaType.AUDIO,//
                    EncodingKey, ENCODING_QUICKTIME_IN32_PCM,
                    MimeTypeKey, MIME_QUICKTIME,//
                    ByteOrderKey, ByteOrder.BIG_ENDIAN,
                    SignedKey, true, SampleSizeInBitsKey, 32),//
                });
        name="QuickTime PCM Codec";
    }
}
