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);