Dynamically print the supported bitrates from the local table,
instead of using a hardcoded log message.
Signed-off-by: Martin Storsjö <martin@martin.st>
... | ... |
@@ -20,6 +20,7 @@ |
20 | 20 |
*/ |
21 | 21 |
|
22 | 22 |
#include "avcodec.h" |
23 |
+#include "libavutil/avstring.h" |
|
23 | 24 |
|
24 | 25 |
static void amr_decode_fix_avctx(AVCodecContext *avctx) |
25 | 26 |
{ |
... | ... |
@@ -40,9 +41,6 @@ static void amr_decode_fix_avctx(AVCodecContext *avctx) |
40 | 40 |
#include <opencore-amrnb/interf_dec.h> |
41 | 41 |
#include <opencore-amrnb/interf_enc.h> |
42 | 42 |
|
43 |
-static const char nb_bitrate_unsupported[] = |
|
44 |
- "bitrate not supported: use one of 4.75k, 5.15k, 5.9k, 6.7k, 7.4k, 7.95k, 10.2k or 12.2k\n"; |
|
45 |
- |
|
46 | 43 |
/* Common code for fixed and float version*/ |
47 | 44 |
typedef struct AMR_bitrates { |
48 | 45 |
int rate; |
... | ... |
@@ -50,20 +48,32 @@ typedef struct AMR_bitrates { |
50 | 50 |
} AMR_bitrates; |
51 | 51 |
|
52 | 52 |
/* Match desired bitrate */ |
53 |
-static int get_bitrate_mode(int bitrate) |
|
53 |
+static int get_bitrate_mode(int bitrate, void *log_ctx) |
|
54 | 54 |
{ |
55 | 55 |
/* make the correspondance between bitrate and mode */ |
56 | 56 |
static const AMR_bitrates rates[] = { |
57 | 57 |
{ 4750, MR475 }, { 5150, MR515 }, { 5900, MR59 }, { 6700, MR67 }, |
58 | 58 |
{ 7400, MR74 }, { 7950, MR795 }, { 10200, MR102 }, { 12200, MR122 } |
59 | 59 |
}; |
60 |
- int i; |
|
60 |
+ int i, best = -1, min_diff = 0; |
|
61 |
+ char log_buf[200]; |
|
61 | 62 |
|
62 |
- for (i = 0; i < 8; i++) |
|
63 |
+ for (i = 0; i < 8; i++) { |
|
63 | 64 |
if (rates[i].rate == bitrate) |
64 | 65 |
return rates[i].mode; |
65 |
- /* no bitrate matching, return an error */ |
|
66 |
- return -1; |
|
66 |
+ if (best < 0 || abs(rates[i].rate - bitrate) < min_diff) { |
|
67 |
+ best = i; |
|
68 |
+ min_diff = abs(rates[i].rate - bitrate); |
|
69 |
+ } |
|
70 |
+ } |
|
71 |
+ /* no bitrate matching exactly, log a warning */ |
|
72 |
+ snprintf(log_buf, sizeof(log_buf), "bitrate not supported: use one of "); |
|
73 |
+ for (i = 0; i < 8; i++) |
|
74 |
+ av_strlcatf(log_buf, sizeof(log_buf), "%.2fk, ", rates[i].rate / 1000.f); |
|
75 |
+ av_strlcatf(log_buf, sizeof(log_buf), "using %.2fk", rates[best].rate / 1000.f); |
|
76 |
+ av_log(log_ctx, AV_LOG_WARNING, "%s\n", log_buf); |
|
77 |
+ |
|
78 |
+ return best; |
|
67 | 79 |
} |
68 | 80 |
|
69 | 81 |
typedef struct AMRContext { |
... | ... |
@@ -171,10 +181,7 @@ static av_cold int amr_nb_encode_init(AVCodecContext *avctx) |
171 | 171 |
return -1; |
172 | 172 |
} |
173 | 173 |
|
174 |
- if ((s->enc_bitrate = get_bitrate_mode(avctx->bit_rate)) < 0) { |
|
175 |
- av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported); |
|
176 |
- return AVERROR(ENOSYS); |
|
177 |
- } |
|
174 |
+ s->enc_bitrate = get_bitrate_mode(avctx->bit_rate, avctx); |
|
178 | 175 |
|
179 | 176 |
return 0; |
180 | 177 |
} |
... | ... |
@@ -195,10 +202,7 @@ static int amr_nb_encode_frame(AVCodecContext *avctx, |
195 | 195 |
AMRContext *s = avctx->priv_data; |
196 | 196 |
int written; |
197 | 197 |
|
198 |
- if ((s->enc_bitrate = get_bitrate_mode(avctx->bit_rate)) < 0) { |
|
199 |
- av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported); |
|
200 |
- return AVERROR(ENOSYS); |
|
201 |
- } |
|
198 |
+ s->enc_bitrate = get_bitrate_mode(avctx->bit_rate, avctx); |
|
202 | 199 |
|
203 | 200 |
written = Encoder_Interface_Encode(s->enc_state, s->enc_bitrate, data, |
204 | 201 |
frame, 0); |
... | ... |
@@ -22,10 +22,7 @@ |
22 | 22 |
#include <vo-amrwbenc/enc_if.h> |
23 | 23 |
|
24 | 24 |
#include "avcodec.h" |
25 |
- |
|
26 |
-static const char wb_bitrate_unsupported[] = |
|
27 |
- "bitrate not supported: use one of 6.6k, 8.85k, 12.65k, 14.25k, 15.85k, " |
|
28 |
- "18.25k, 19.85k, 23.05k, or 23.85k\n"; |
|
25 |
+#include "libavutil/avstring.h" |
|
29 | 26 |
|
30 | 27 |
typedef struct AMRWBContext { |
31 | 28 |
void *state; |
... | ... |
@@ -33,18 +30,30 @@ typedef struct AMRWBContext { |
33 | 33 |
int allow_dtx; |
34 | 34 |
} AMRWBContext; |
35 | 35 |
|
36 |
-static int get_wb_bitrate_mode(int bitrate) |
|
36 |
+static int get_wb_bitrate_mode(int bitrate, void *log_ctx) |
|
37 | 37 |
{ |
38 | 38 |
/* make the correspondance between bitrate and mode */ |
39 | 39 |
static const int rates[] = { 6600, 8850, 12650, 14250, 15850, 18250, |
40 | 40 |
19850, 23050, 23850 }; |
41 |
- int i; |
|
41 |
+ int i, best = -1, min_diff = 0; |
|
42 |
+ char log_buf[200]; |
|
42 | 43 |
|
43 |
- for (i = 0; i < 9; i++) |
|
44 |
+ for (i = 0; i < 9; i++) { |
|
44 | 45 |
if (rates[i] == bitrate) |
45 | 46 |
return i; |
46 |
- /* no bitrate matching, return an error */ |
|
47 |
- return -1; |
|
47 |
+ if (best < 0 || abs(rates[i] - bitrate) < min_diff) { |
|
48 |
+ best = i; |
|
49 |
+ min_diff = abs(rates[i] - bitrate); |
|
50 |
+ } |
|
51 |
+ } |
|
52 |
+ /* no bitrate matching exactly, log a warning */ |
|
53 |
+ snprintf(log_buf, sizeof(log_buf), "bitrate not supported: use one of "); |
|
54 |
+ for (i = 0; i < 9; i++) |
|
55 |
+ av_strlcatf(log_buf, sizeof(log_buf), "%.2fk, ", rates[i] / 1000.f); |
|
56 |
+ av_strlcatf(log_buf, sizeof(log_buf), "using %.2fk", rates[best] / 1000.f); |
|
57 |
+ av_log(log_ctx, AV_LOG_WARNING, "%s\n", log_buf); |
|
58 |
+ |
|
59 |
+ return best; |
|
48 | 60 |
} |
49 | 61 |
|
50 | 62 |
static av_cold int amr_wb_encode_init(AVCodecContext *avctx) |
... | ... |
@@ -61,10 +70,7 @@ static av_cold int amr_wb_encode_init(AVCodecContext *avctx) |
61 | 61 |
return AVERROR(ENOSYS); |
62 | 62 |
} |
63 | 63 |
|
64 |
- if ((s->mode = get_wb_bitrate_mode(avctx->bit_rate)) < 0) { |
|
65 |
- av_log(avctx, AV_LOG_ERROR, wb_bitrate_unsupported); |
|
66 |
- return AVERROR(ENOSYS); |
|
67 |
- } |
|
64 |
+ s->mode = get_wb_bitrate_mode(avctx->bit_rate, avctx); |
|
68 | 65 |
|
69 | 66 |
avctx->frame_size = 320; |
70 | 67 |
avctx->coded_frame = avcodec_alloc_frame(); |
... | ... |
@@ -91,10 +97,7 @@ static int amr_wb_encode_frame(AVCodecContext *avctx, |
91 | 91 |
AMRWBContext *s = avctx->priv_data; |
92 | 92 |
int size; |
93 | 93 |
|
94 |
- if ((s->mode = get_wb_bitrate_mode(avctx->bit_rate)) < 0) { |
|
95 |
- av_log(avctx, AV_LOG_ERROR, wb_bitrate_unsupported); |
|
96 |
- return AVERROR(ENOSYS); |
|
97 |
- } |
|
94 |
+ s->mode = get_wb_bitrate_mode(avctx->bit_rate, avctx); |
|
98 | 95 |
size = E_IF_encode(s->state, s->mode, data, frame, s->allow_dtx); |
99 | 96 |
return size; |
100 | 97 |
} |