[FFmpeg-devel] [PATCH 4/6] avradio/sdrdemux: Skiping detection of AM stations at DC point

Michael Niedermayer michael at niedermayer.cc
Mon Jul 24 21:35:33 EEST 2023


Also use this to detect a DC offset instead of the driver

Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
---
 libavradio/sdr.h      |  1 +
 libavradio/sdrdemux.c | 11 ++++++++++-
 tests/ref/fate/sdr-am | 38 +++++++++++++++-----------------------
 3 files changed, 26 insertions(+), 24 deletions(-)

diff --git a/libavradio/sdr.h b/libavradio/sdr.h
index 7d7bfd6806..a5a291ee37 100644
--- a/libavradio/sdr.h
+++ b/libavradio/sdr.h
@@ -260,6 +260,7 @@ typedef struct SDRContext {
 
     int rtlsdr_fixes;
     int sdrplay_fixes;
+    int dc_fix;
 } SDRContext;
 
 typedef struct ModulationDescriptor {
diff --git a/libavradio/sdrdemux.c b/libavradio/sdrdemux.c
index 123a1a9d0f..25f0012777 100644
--- a/libavradio/sdrdemux.c
+++ b/libavradio/sdrdemux.c
@@ -596,6 +596,14 @@ static int probe_am(SDRContext *sdr)
                     continue;
                 }
 
+                if (i == sdr->block_size) {
+                    if (sdr->dc_fix < 0) {
+                        sdr->dc_fix = 1;
+                        av_log(sdr->avfmt, AV_LOG_INFO, "Skiping AM station detection at DC point and enabling DC correction\n");
+                        continue;
+                    }
+                }
+
                 create_candidate_station(sdr, AM, INDEX2F(peak_i), bandwidth_f, score);
             }
         }
@@ -1931,7 +1939,7 @@ process_next_block:
     if (sdr->sample_size == 2) {
         const int8_t *halfblock0 = fifo_element[0].halfblock;
         const int8_t *halfblock1 = fifo_element[1].halfblock;
-        if (sdr->rtlsdr_fixes>0) {
+        if (sdr->dc_fix>0) {
             int sum = 0;
             float offset;
             for (i = 0; i<2*sdr->block_size; i++)
@@ -2274,6 +2282,7 @@ const AVOption ff_sdr_options[] = {
     { "driver"  , "sdr driver name"  , OFFSET(driver_name), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC},
     { "rtlsdr_fixes" , "workaround rtlsdr issues", OFFSET(rtlsdr_fixes), AV_OPT_TYPE_INT , {.i64 = -1}, -1, 1, DEC},
     { "sdrplay_fixes" , "workaround sdrplay issues", OFFSET(sdrplay_fixes), AV_OPT_TYPE_INT , {.i64 = -1}, -1, 1, DEC},
+    { "dc_fix" , "Apply DC correction", OFFSET(dc_fix), AV_OPT_TYPE_INT , {.i64 = -1}, -1, 1, DEC},
     { "sdr_sr"  , "sdr sample rate"  , OFFSET(sdr_sample_rate ), AV_OPT_TYPE_INT , {.i64 = 0}, 0, INT_MAX, DEC},
     { "sdr_freq", "sdr frequency"    , OFFSET(user_wanted_freq), AV_OPT_TYPE_INT64 , {.i64 = 9000000}, 0, INT64_MAX, DEC},
     { "gain" , "sdr overall gain",  OFFSET(sdr_gain),  AV_OPT_TYPE_INT , {.i64 =  GAIN_SDR_AGC}, -3, INT_MAX, DEC, "gain"},
diff --git a/tests/ref/fate/sdr-am b/tests/ref/fate/sdr-am
index b8a34ee488..e2ae353902 100644
--- a/tests/ref/fate/sdr-am
+++ b/tests/ref/fate/sdr-am
@@ -28,28 +28,20 @@
 #codec_id 5: pcm_u8
 #sample_rate 5: 16000
 #channel_layout_name 5: stereo
-#tb 6: 1/16000
-#media_type 6: audio
-#codec_id 6: pcm_u8
-#sample_rate 6: 16000
-#channel_layout_name 6: stereo
 0,          0,          0,        1,   320000, 0x816a0964
 0,          1,          1,        1,   320000, 0x140ce2da
-1,       2048,       2048,     1024,     2048, 0x2276fdd1
-2,       2048,       2048,     1024,     2048, 0x4d31ff0f
-3,       2048,       2048,     1024,     2048, 0x3cd002ad
-4,       2048,       2048,     1024,     2048, 0x8bdd034d
-5,       2048,       2048,     1024,     2048, 0xc6430169
-1,       3072,       3072,     1024,     2048, 0xa0810031
-2,       3072,       3072,     1024,     2048, 0xb307000d
-3,       3072,       3072,     1024,     2048, 0x3f6d01d4
-4,       3072,       3072,     1024,     2048, 0x2de9fde9
-5,       3072,       3072,     1024,     2048, 0xad7efe6f
-6,       3072,       3072,     1024,     2048, 0x9c840168
-1,       4096,       4096,     1024,     2048, 0x61a50250
-2,       4096,       4096,     1024,     2048, 0x7e7cfe03
-3,       4096,       4096,     1024,     2048, 0x6561fc7b
-4,       4096,       4096,     1024,     2048, 0xdcd6ff8d
-5,       4096,       4096,     1024,     2048, 0xedac0493
-6,       4096,       4096,     1024,     2048, 0x970a0066
-0,          3,          3,        1,   320000, 0x9fb0c309
+1,       2048,       2048,     1024,     2048, 0x4d31ff0f
+2,       2048,       2048,     1024,     2048, 0x3cd002ad
+3,       2048,       2048,     1024,     2048, 0x8bdd034d
+4,       2048,       2048,     1024,     2048, 0xc6430169
+1,       3072,       3072,     1024,     2048, 0xb307000d
+2,       3072,       3072,     1024,     2048, 0x3f6d01d4
+3,       3072,       3072,     1024,     2048, 0x2de9fde9
+4,       3072,       3072,     1024,     2048, 0xad7efe6f
+5,       3072,       3072,     1024,     2048, 0x9c840168
+1,       4096,       4096,     1024,     2048, 0x7e7cfe03
+2,       4096,       4096,     1024,     2048, 0x6561fc7b
+3,       4096,       4096,     1024,     2048, 0xdcd6ff8d
+4,       4096,       4096,     1024,     2048, 0xedac0493
+5,       4096,       4096,     1024,     2048, 0x970a0066
+0,          3,          3,        1,   320000, 0x6ea8fa49
-- 
2.31.1



More information about the ffmpeg-devel mailing list