Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Subframe.java « javaFlacEncoder « src - github.com/ClusterM/android-speech-recognition.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 7d0a08d1acff60b75b819ffde396d4b4200a0297 (plain)
1
2
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
 * Copyright (C) 2010  Preston Lacey http://javaflacencoder.sourceforge.net/
 * All Rights Reserved.
 *
 * This library 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.
 *
 * This library 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 this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

package javaFlacEncoder;

/**
 * Description: This abstract class declares the methods needed to retrieve
 * encoded data in a standard format(across the different implemented Subframe
 * types), as well as the generic methods needed to write the subframe header.
 * It is assumed that objects of this type will be reused in future frames,
 * rather than being destroyed and made anew. This is to avoid the overhead
 * associated with creating and destroying objects in Java.
 * @author Preston Lacey
 */
public abstract class Subframe {

  /** StreamConfiguration used for encoding. The same StreamConfiguration
   *  MUST be used throughout an entire FLAC stream */
  protected StreamConfiguration sc;

  /** EncodingConfiguration used for encoding. This may be altered between
   * frames, but must be the same for each subframe within that frame */
  protected EncodingConfiguration ec;
  /** Store for size of last subframe encoded(in bits). */
  protected int lastEncodedSize;

  /**
   * Constructor is private to prevenet it's use, as a subframe is not usable
   * without first setting a StreamConfiguration(therefore, use other
   * constructor.
   */
  private Subframe() {

  }

  /**
   * Constructor. Sets StreamConfiguration to use. If the StreamConfiguration
   * must later be changed, a new Subframe object must be created as well. A
   * default EncodingConfiguration is created using EncodingConfiguration's
   * default Constructor. This configuration should create a decent encode,
   * but may be altered if desired.
   *
   * @param sc StreamConfiguration to use for encoding.
   */
  public Subframe(StreamConfiguration sc) {
    this.sc = sc;
    ec = new EncodingConfiguration();
  }

  /**
   * This method is used to set the encoding configuration.
   * @param ec    encoding configuration to use.
   * @return      true if configuration was changed, false otherwise
   */
  public boolean registerConfiguration(EncodingConfiguration ec) {
    this.ec = ec;
    return true;
  }

  /**
   * Encodes samples into the appropriate compressed format, saving the result
   * in the given “data” EncodedElement list. Encodes 'count' samples, from
   * index 'start', to index 'start' times 'skip', where “skip” is the format
   * that samples may be packed in an array. For example, 'samples' may
   * include both left and right samples of a stereo stream, while this
   * SubFrame is only encoding the 'right' channel(channel 2). Therefore,
   * “skip” would equal 2, resulting in the valid indices being only those
   * where “index mod 2 equals 1”.
   * @param samples   the audio samples to encode. This array may contain
   * samples for multiple channels, interleaved; only one of these channels is
   * encoded by a subframe.
   * @param count     the number of samples to encode.
   * @param start     the index to start at in the array.
   * @param skip      the number of indices to skip between successive samples
   *                  (for use when channels are interleaved in the given
   *                  array).
   * @param data      the EncodedElement to attach encoded data to. Data in
   *                  EncodedElement given is not altered. New data is
   *                  attached starting with “data.getNext()”. If “data”
   *                  already has a “next” set, it will be lost!
   * @param offset
   * @param bitsPerSample Number of bits per single-channel sample. This may
   * differ from the StreamConfiguration's sample size, depending on the
   * subframe used(i.e, the "side-channel" of a FLAC stream uses one extra bit
   * compared to the input channels).
   *
   * @return          number of encoded samples, or negative value indicating
   *                  an error has occurred.
   *
   */
  public abstract int encodeSamples(int[] samples, int count, int start, int skip,
      EncodedElement data, int offset, int bitsPerSample);

  /**
   * Returns the total number of valid bits used in the last encoding(i.e, the
   * number of compressed bits used). This is here for convenience, as the
   * calling object may also loop through the resulting EncodingElement from
   * the encoding process and sum the valid bits.
   *
   * @return      an integer with value of the number of bits used in last
   *              encoding.
   */
  public int getEncodedSize() {
    return lastEncodedSize;
  }
}