RestartHeader *rh = &ctx->restart_header [substr];
int substr_restart_frame = restart_frame;
uint8_t parity, checksum;
- PutBitContext pb, tmpb;
+ PutBitContext pb;
int params_changed;
ctx->cur_restart_header = rh;
put_bits(&pb, 32, END_OF_STREAM);
}
- /* Data must be flushed for the checksum and parity to be correct. */
- tmpb = pb;
- flush_put_bits(&tmpb);
+ /* Data must be flushed for the checksum and parity to be correct;
+ * notice that we already are word-aligned here. */
+ flush_put_bits(&pb);
- parity = ff_mlp_calculate_parity(buf, put_bits_count(&pb) >> 3) ^ 0xa9;
- checksum = ff_mlp_checksum8 (buf, put_bits_count(&pb) >> 3);
+ parity = ff_mlp_calculate_parity(buf, put_bytes_output(&pb)) ^ 0xa9;
+ checksum = ff_mlp_checksum8 (buf, put_bytes_output(&pb));
put_bits(&pb, 8, parity );
put_bits(&pb, 8, checksum);
flush_put_bits(&pb);
- end += put_bits_count(&pb) >> 3;
+ end += put_bytes_output(&pb);
substream_data_len[substr] = end;
- buf += put_bits_count(&pb) >> 3;
+ buf += put_bytes_output(&pb);
}
ctx->major_cur_subblock_index += ctx->major_filter_state_subblock + 1;
****************************************************************************/
typedef struct {
- char path[MAJOR_HEADER_INTERVAL + 3];
+ char path[MAJOR_HEADER_INTERVAL + 2];
+ int cur_idx;
int bitcount;
} PathCounter;
-static const char *path_counter_codebook[] = { "0", "1", "2", "3", };
-
-#define ZERO_PATH '0'
#define CODEBOOK_CHANGE_BITS 21
static void clear_path_counter(PathCounter *path_counter)
{
- unsigned int i;
-
- for (i = 0; i < NUM_CODEBOOKS + 1; i++) {
- path_counter[i].path[0] = ZERO_PATH;
- path_counter[i].path[1] = 0x00;
- path_counter[i].bitcount = 0;
- }
+ memset(path_counter, 0, (NUM_CODEBOOKS + 1) * sizeof(*path_counter));
}
static int compare_best_offset(BestOffset *prev, BestOffset *cur)
static int best_codebook_path_cost(MLPEncodeContext *ctx, unsigned int channel,
PathCounter *src, int cur_codebook)
{
- BestOffset *cur_bo, *prev_bo = restart_best_offset;
+ int idx = src->cur_idx;
+ BestOffset *cur_bo = ctx->best_offset[idx][channel],
+ *prev_bo = idx ? ctx->best_offset[idx - 1][channel] : restart_best_offset;
int bitcount = src->bitcount;
- char *path = src->path + 1;
- int prev_codebook;
- int i;
-
- for (i = 0; path[i]; i++)
- prev_bo = ctx->best_offset[i][channel];
-
- prev_codebook = path[i - 1] - ZERO_PATH;
-
- cur_bo = ctx->best_offset[i][channel];
+ int prev_codebook = src->path[idx];
bitcount += cur_bo[cur_codebook].bitcount;
prev_best_bitcount = temp_bitcount;
if (src_path != dst_path)
memcpy(dst_path, src_path, sizeof(PathCounter));
- av_strlcat(dst_path->path, path_counter_codebook[codebook], sizeof(dst_path->path));
+ if (dst_path->cur_idx < FF_ARRAY_ELEMS(dst_path->path) - 1)
+ dst_path->path[++dst_path->cur_idx] = codebook;
dst_path->bitcount = temp_bitcount;
}
}
for (index = 0; index < ctx->number_of_subblocks; index++) {
ChannelParams *cp = ctx->seq_channel_params + index*(ctx->avctx->channels) + channel;
- best_codebook = *best_path++ - ZERO_PATH;
+ best_codebook = *best_path++;
cur_bo = &ctx->best_offset[index][channel][best_codebook];
cp->huff_offset = cur_bo->offset;
}
#if CONFIG_MLP_ENCODER
-AVCodec ff_mlp_encoder = {
+const AVCodec ff_mlp_encoder = {
.name ="mlp",
.long_name = NULL_IF_CONFIG_SMALL("MLP (Meridian Lossless Packing)"),
.type = AVMEDIA_TYPE_AUDIO,
};
#endif
#if CONFIG_TRUEHD_ENCODER
-AVCodec ff_truehd_encoder = {
+const AVCodec ff_truehd_encoder = {
.name ="truehd",
.long_name = NULL_IF_CONFIG_SMALL("TrueHD"),
.type = AVMEDIA_TYPE_AUDIO,