Mercurial > libavcodec.hg
comparison flacenc.c @ 3478:5a71102c2770 libavcodec
log prediction order search method
author | michael |
---|---|
date | Sun, 16 Jul 2006 15:46:45 +0000 |
parents | 30ac8a424448 |
children | 9eb59c4a22d2 |
comparison
equal
deleted
inserted
replaced
3477:30ac8a424448 | 3478:5a71102c2770 |
---|---|
41 #define ORDER_METHOD_EST 0 | 41 #define ORDER_METHOD_EST 0 |
42 #define ORDER_METHOD_2LEVEL 1 | 42 #define ORDER_METHOD_2LEVEL 1 |
43 #define ORDER_METHOD_4LEVEL 2 | 43 #define ORDER_METHOD_4LEVEL 2 |
44 #define ORDER_METHOD_8LEVEL 3 | 44 #define ORDER_METHOD_8LEVEL 3 |
45 #define ORDER_METHOD_SEARCH 4 | 45 #define ORDER_METHOD_SEARCH 4 |
46 #define ORDER_METHOD_LOG 5 | |
46 | 47 |
47 #define FLAC_STREAMINFO_SIZE 34 | 48 #define FLAC_STREAMINFO_SIZE 34 |
48 | 49 |
49 #define MIN_LPC_ORDER 1 | 50 #define MIN_LPC_ORDER 1 |
50 #define MAX_LPC_ORDER 32 | 51 #define MAX_LPC_ORDER 32 |
289 } | 290 } |
290 av_log(avctx, AV_LOG_DEBUG, " prediction order: %d, %d\n", | 291 av_log(avctx, AV_LOG_DEBUG, " prediction order: %d, %d\n", |
291 s->options.min_prediction_order, s->options.max_prediction_order); | 292 s->options.min_prediction_order, s->options.max_prediction_order); |
292 | 293 |
293 if(avctx->prediction_order_method >= 0) { | 294 if(avctx->prediction_order_method >= 0) { |
294 if(avctx->prediction_order_method > ORDER_METHOD_SEARCH) { | 295 if(avctx->prediction_order_method > ORDER_METHOD_LOG) { |
295 av_log(avctx, AV_LOG_ERROR, "invalid prediction order method: %d\n", | 296 av_log(avctx, AV_LOG_ERROR, "invalid prediction order method: %d\n", |
296 avctx->prediction_order_method); | 297 avctx->prediction_order_method); |
297 return -1; | 298 return -1; |
298 } | 299 } |
299 s->options.prediction_order_method = avctx->prediction_order_method; | 300 s->options.prediction_order_method = avctx->prediction_order_method; |
307 "4-level"); break; | 308 "4-level"); break; |
308 case ORDER_METHOD_8LEVEL: av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", | 309 case ORDER_METHOD_8LEVEL: av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", |
309 "8-level"); break; | 310 "8-level"); break; |
310 case ORDER_METHOD_SEARCH: av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", | 311 case ORDER_METHOD_SEARCH: av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", |
311 "full search"); break; | 312 "full search"); break; |
313 case ORDER_METHOD_LOG: av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", | |
314 "log search"); break; | |
312 } | 315 } |
313 | 316 |
314 if(avctx->min_partition_order >= 0) { | 317 if(avctx->min_partition_order >= 0) { |
315 if(avctx->min_partition_order > MAX_PARTITION_ORDER) { | 318 if(avctx->min_partition_order > MAX_PARTITION_ORDER) { |
316 av_log(avctx, AV_LOG_ERROR, "invalid min partition order: %d\n", | 319 av_log(avctx, AV_LOG_ERROR, "invalid min partition order: %d\n", |
949 if(bits[i] < bits[opt_order]) { | 952 if(bits[i] < bits[opt_order]) { |
950 opt_order = i; | 953 opt_order = i; |
951 } | 954 } |
952 } | 955 } |
953 opt_order++; | 956 opt_order++; |
957 } else if(omethod == ORDER_METHOD_LOG) { | |
958 uint32_t bits[MAX_LPC_ORDER]; | |
959 int step; | |
960 | |
961 opt_order= min_order - 1 + (max_order-min_order)/3; | |
962 memset(bits, -1, sizeof(bits)); | |
963 | |
964 for(step=16 ;step; step>>=1){ | |
965 int last= opt_order; | |
966 for(i=last-step; i<=last+step; i+= step){ | |
967 if(i<min_order-1 || i>=max_order || bits[i] < UINT32_MAX) | |
968 continue; | |
969 encode_residual_lpc(res, smp, n, i+1, coefs[i], shift[i]); | |
970 bits[i] = calc_rice_params_lpc(&sub->rc, min_porder, max_porder, | |
971 res, n, i+1, sub->obits, precision); | |
972 if(bits[i] < bits[opt_order]) | |
973 opt_order= i; | |
974 } | |
975 } | |
976 opt_order++; | |
954 } | 977 } |
955 | 978 |
956 sub->order = opt_order; | 979 sub->order = opt_order; |
957 sub->type = FLAC_SUBFRAME_LPC; | 980 sub->type = FLAC_SUBFRAME_LPC; |
958 sub->type_code = sub->type | (sub->order-1); | 981 sub->type_code = sub->type | (sub->order-1); |