Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Michael Niedermayer <michael@niedermayer.cc>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: [FFmpeg-devel] [PATCH 11/14] avradio/sdr: More atomics, less Mutexes
Date: Tue, 18 Jul 2023 23:45:39 +0200
Message-ID: <20230718214542.685375-11-michael@niedermayer.cc> (raw)
In-Reply-To: <20230718214542.685375-1-michael@niedermayer.cc>

Maybe this is cleaner

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 libavradio/sdr.h      |  5 +++--
 libavradio/sdrdemux.c | 38 +++++++++++++++++++++++---------------
 2 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/libavradio/sdr.h b/libavradio/sdr.h
index 27ec1db4f3..3f76aec2a6 100644
--- a/libavradio/sdr.h
+++ b/libavradio/sdr.h
@@ -172,6 +172,7 @@ typedef struct SDRContext {
     AVComplexFloat *windowed_block;
     int64_t block_center_freq;              ///< center frequency the current block contains
     int64_t station_freq;
+    int64_t user_wanted_freq;
     int sample_size;
     double sample_scale;
 
@@ -218,8 +219,8 @@ typedef struct SDRContext {
     AVFifo *empty_block_fifo;
     AVFifo *full_block_fifo;
     atomic_int close_requested;
-    int64_t wanted_freq;                    ///< center frequency we want the hw to provide next
-    int seek_direction;                     ///< if a seek is requested this is -1 or 1 otherwise 0
+    atomic_int_least64_t wanted_freq;       ///< center frequency we want the hw to provide next, only written to by main thread
+    atomic_int seek_direction;              ///< if a seek is requested this is -1 or 1 otherwise 0, only written to by main thread
     int skip_probe;
 
     /**
diff --git a/libavradio/sdrdemux.c b/libavradio/sdrdemux.c
index d5ea2d85b4..a9ddf93733 100644
--- a/libavradio/sdrdemux.c
+++ b/libavradio/sdrdemux.c
@@ -1351,14 +1351,12 @@ static int snap2station(SDRContext *sdr, int *seek_direction) {
             return ret;
         }
 
-        pthread_mutex_lock(&sdr->mutex);
-        *seek_direction     =
-        sdr->seek_direction = 0;
-        sdr->wanted_freq = wanted_freq;
+        *seek_direction     = 0;
+        atomic_store(&sdr->seek_direction, 0);
+        atomic_store(&sdr->wanted_freq, wanted_freq);
         //200*1000 had artifacts
 
-        av_log(avfmt, AV_LOG_DEBUG, "request f = %"PRId64"\n", sdr->wanted_freq);
-        pthread_mutex_unlock(&sdr->mutex);
+        av_log(avfmt, AV_LOG_DEBUG, "request f = %"PRId64"\n", atomic_load(&sdr->wanted_freq));
         return 1;
     }
 
@@ -1426,6 +1424,8 @@ static void *soapy_needs_bigger_buffers_worker(SDRContext *sdr)
 {
     AVFormatContext *avfmt = sdr->avfmt;
     unsigned block_counter = 0;
+    int64_t local_wanted_freq = 0;
+    int64_t last_wanted_freq = 0;
 
     sdr->remaining_file_block_size = 0;
 
@@ -1436,6 +1436,8 @@ static void *soapy_needs_bigger_buffers_worker(SDRContext *sdr)
         int remaining, ret;
         int empty_blocks, full_blocks;
         float wanted_gain = atomic_load(&sdr->wanted_gain) / 65536.0;
+        int64_t wanted_freq = atomic_load(&sdr->wanted_freq);
+        int seek_direction = atomic_load(&sdr->seek_direction);
 
         //i wish av_fifo was thread safe
         pthread_mutex_lock(&sdr->mutex);
@@ -1457,16 +1459,22 @@ static void *soapy_needs_bigger_buffers_worker(SDRContext *sdr)
 
         block_counter ++;
         pthread_mutex_lock(&sdr->mutex);
+        // Has the main thread changed the wanted frequency ? if so lets reset our loop to it
+        if (wanted_freq != last_wanted_freq) {
+            local_wanted_freq =
+            last_wanted_freq = wanted_freq;
+        }
+
         // we try to get 2 clean blocks after windowing, to improve chances scanning doesnt miss too much
         // First block after parameter change is not reliable, we do not assign it any frequency
         // 2 blocks are needed with windowing to get a clean FFT output
         // Thus > 3 is the minimum for the next frequency update if we want to do something reliable with the data
-        if (sdr->seek_direction && block_counter > 5) {
-            sdr->wanted_freq = snap2band(sdr, sdr->wanted_freq, sdr->seek_direction*sdr->bandwidth*0.5);
+        if (seek_direction && block_counter > 5) {
+            local_wanted_freq = snap2band(sdr, local_wanted_freq, seek_direction*sdr->bandwidth*0.5);
         }
-        if (fabs(sdr->wanted_freq - sdr->freq) > 1500) {
+        if (fabs(local_wanted_freq - sdr->freq) > 1500) {
             //We could use a seperate MUTEX for the FIFO and for soapy
-            ff_sdr_set_freq(sdr, sdr->wanted_freq);
+            ff_sdr_set_freq(sdr, local_wanted_freq);
             //This shouldnt really cause any problem if we just continue on error except that we continue returning data with the previous target frequency range
             //And theres not much else we can do, an error message was already printed by ff_sdr_set_freq() in that case
             block_counter = 0; // we just changed the frequency, do not trust the next blocks content
@@ -1662,6 +1670,8 @@ int ff_sdr_common_init(AVFormatContext *s)
     av_fifo_auto_grow_limit(sdr-> full_block_fifo, sdr->sdr_sample_rate / sdr->block_size);
 
     atomic_init(&sdr->close_requested, 0);
+    atomic_init(&sdr->seek_direction, 0);
+    atomic_init(&sdr->wanted_freq, sdr->user_wanted_freq);
     atomic_init(&sdr->wanted_gain, lrint((sdr->min_gain + sdr->max_gain) * 65536 / 2));
     ret = pthread_mutex_init(&sdr->mutex, NULL);
     if (ret) {
@@ -1810,8 +1820,8 @@ process_next_block:
     ret = av_fifo_peek(sdr->full_block_fifo, &fifo_element, 2, 0);
     if (ret >= 0)
         av_fifo_drain2(sdr->full_block_fifo, 1);
-    seek_direction = sdr->seek_direction; //This doesnt need a mutex here at all but tools might complain
     pthread_mutex_unlock(&sdr->mutex);
+    seek_direction = atomic_load(&sdr->seek_direction);
 
     if (ret < 0) {
         av_log(s, AV_LOG_DEBUG, "EAGAIN on not enough data\n");
@@ -2094,9 +2104,7 @@ int ff_sdr_read_seek(AVFormatContext *s, int stream_index,
         return ret;
     //snap2station found no station lets command the thread to seek
     if (!ret) {
-        pthread_mutex_lock(&sdr->mutex);
-        sdr->seek_direction = dir;
-        pthread_mutex_unlock(&sdr->mutex);
+        atomic_store(&sdr->seek_direction, dir);
         flush_fifo(sdr, sdr->full_block_fifo);
     }
 
@@ -2207,7 +2215,7 @@ const AVOption ff_sdr_options[] = {
     { "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},
     { "sdr_sr"  , "sdr sample rate"  , OFFSET(sdr_sample_rate ), AV_OPT_TYPE_INT , {.i64 = 0}, 0, INT_MAX, DEC},
-    { "sdr_freq", "sdr frequency"    , OFFSET(wanted_freq), AV_OPT_TYPE_INT64 , {.i64 = 9000000}, 0, INT64_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"},
         { "sdr_agc", "SDR AGC (if supported)", 0, AV_OPT_TYPE_CONST, {.i64 = GAIN_SDR_AGC}, 0, 0, DEC, "gain"},
         { "sw_agc", "Software AGC", 0, AV_OPT_TYPE_CONST, {.i64 = GAIN_SW_AGC}, 0, 0, DEC, "gain"},
-- 
2.31.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  parent reply	other threads:[~2023-07-18 21:47 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-18 21:45 [FFmpeg-devel] [PATCH 01/14] avradio/sdrdemux: Add Mittelwelle / Mediumwave / Mediumfrequency band Michael Niedermayer
2023-07-18 21:45 ` [FFmpeg-devel] [PATCH 02/14] avradio/sdrdemux: Fix corner case in snap2band Michael Niedermayer
2023-07-18 21:45 ` [FFmpeg-devel] [PATCH 03/14] avradio/sdrdemux: Fix seeking to stations at the edge of the range Michael Niedermayer
2023-07-18 21:45 ` [FFmpeg-devel] [PATCH 04/14] avradio/sdrdemux: snap2station() should look only at the vissible window Michael Niedermayer
2023-07-18 21:45 ` [FFmpeg-devel] [PATCH 05/14] avradio/sdr: snap2station() documentation Michael Niedermayer
2023-07-18 21:45 ` [FFmpeg-devel] [PATCH 06/14] avradio/sdrdemux: do not hack bandwidth value in random places Michael Niedermayer
2023-07-18 21:45 ` [FFmpeg-devel] [PATCH 07/14] avradio/sdrdemux: snap2station consider more distant stations Michael Niedermayer
2023-07-18 21:45 ` [FFmpeg-devel] [PATCH 08/14] tests: Add avradio/sdrdemux tests Michael Niedermayer
2023-07-21 18:42   ` Michael Niedermayer
2023-07-21 23:51     ` Michael Niedermayer
2023-07-18 21:45 ` [FFmpeg-devel] [PATCH 09/14] avradio/sdr: Remove code setting frequency from variable being 0 Michael Niedermayer
2023-07-18 21:45 ` [FFmpeg-devel] [PATCH 10/14] avradio/sdrdemux: no need to set wanted_freq from sdrfile_initial_setup() Michael Niedermayer
2023-07-18 21:45 ` Michael Niedermayer [this message]
2023-07-18 21:45 ` [FFmpeg-devel] [PATCH 12/14] avradio/sdrdemux: + vs. - bug Michael Niedermayer
2023-07-18 21:45 ` [FFmpeg-devel] [PATCH 13/14] avradio/sdrdemux: snap2band doesnt change anything so use const Michael Niedermayer
2023-07-18 21:45 ` [FFmpeg-devel] [PATCH 14/14] avradio/sdrdemux: Fix wraparound with seeking Michael Niedermayer
2023-07-22 13:30 ` [FFmpeg-devel] [PATCH 01/14] avradio/sdrdemux: Add Mittelwelle / Mediumwave / Mediumfrequency band Michael Niedermayer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230718214542.685375-11-michael@niedermayer.cc \
    --to=michael@niedermayer.cc \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git