Skip to content

Commit d6a3250

Browse files
committed
upipe_pcap_src: new pipe to read pcap files
1 parent 4798c26 commit d6a3250

File tree

13 files changed

+785
-2
lines changed

13 files changed

+785
-2
lines changed

.github/workflows/test-suite.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ jobs:
120120
LIBS: >
121121
ev asound2 x264 x265 speexdsp png freetype6 zvbi gcrypt tasn1 dvbv5
122122
udev avcodec avformat avfilter swresample swscale gl1-mesa glu1-mesa
123-
srt-gnutls gnutls28 ssl bearssl ebur128 dvbcsa
123+
srt-gnutls gnutls28 ssl bearssl ebur128 dvbcsa pcap
124124
run: |
125125
if [ "${{ matrix.arch }}" != "amd64" ]; then
126126
sudo apt-get install qemu-user-binfmt
@@ -135,7 +135,7 @@ jobs:
135135
- name: Install dependencies (macOS)
136136
if: runner.os == 'macOS'
137137
run: |
138-
brew install autoconf automake libtool pkg-config nasm ffmpeg \
138+
brew install autoconf automake libtool pkg-config nasm ffmpeg libpcap \
139139
freetype libebur128 libev libgcrypt libtasn1 speexdsp x264 x265 luajit
140140
BREW_PREFIX="$(brew --prefix)"
141141
set-env HOST_CC "clang"
@@ -146,6 +146,7 @@ jobs:
146146
set-env ld_preload_san "$(clang --print-file-name libclang_rt.asan_osx_dynamic.dylib)"
147147
set-env UBSAN_OPTIONS "print_stacktrace=1"
148148
set-env LLVM_DWARFDUMP "dwarfdump"
149+
set-env PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$BREW_PREFIX/opt/libpcap/lib/pkgconfig"
149150
150151
- name: Install bitstream
151152
run: |

examples/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@
1919
/ts_encrypt
2020
/dvbsrc
2121
/frame
22+
/pcap

examples/Build.mk

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ multicatudp-src = multicatudp.c
7070
multicatudp-deps = upipe_fsink
7171
multicatudp-libs = libupipe libupipe_modules libupipe_pthread libupump_ev
7272

73+
noinst-targets += pcap
74+
pcap-src = pcap.c
75+
pcap-libs = libupipe libupipe_modules libupipe_pcap libupump_ev
76+
7377
noinst-targets += rist_rx
7478
rist_rx-src = rist_rx.c
7579
rist_rx-deps = upipe_udpsink upipe_rtpfb

examples/pcap.c

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/*
2+
* Copyright (C) 2025 Open Broadcast Systems Ltd
3+
*
4+
* Authors: Rafaël Carré
5+
*
6+
* SPDX-License-Identifier: MIT
7+
*/
8+
9+
#include <stdlib.h>
10+
#include <stdio.h>
11+
12+
#include "upipe/uprobe.h"
13+
#include "upipe/uprobe_stdio.h"
14+
#include "upipe/uprobe_prefix.h"
15+
#include "upipe/uprobe_uref_mgr.h"
16+
#include "upipe/uprobe_uclock.h"
17+
#include "upipe/uprobe_upump_mgr.h"
18+
#include "upipe/uprobe_ubuf_mem.h"
19+
#include "upipe/umem.h"
20+
#include "upipe/uclock.h"
21+
#include "upipe/uclock_std.h"
22+
#include "upipe/umem_pool.h"
23+
#include "upipe/udict.h"
24+
#include "upipe/udict_inline.h"
25+
#include "upipe/uref.h"
26+
#include "upipe/uref_std.h"
27+
#include "upipe/upipe.h"
28+
#include "upipe/upump.h"
29+
#include "upump-ev/upump_ev.h"
30+
#include "upipe-pcap/upipe_pcap_src.h"
31+
#include "upipe-modules/upipe_null.h"
32+
33+
#define UPROBE_LOG_LEVEL UPROBE_LOG_INFO
34+
#define UMEM_POOL 512
35+
#define UDICT_POOL_DEPTH 500
36+
#define UREF_POOL_DEPTH 500
37+
#define UBUF_POOL_DEPTH 3000
38+
#define UBUF_SHARED_POOL_DEPTH 50
39+
#define UPUMP_POOL 10
40+
#define UPUMP_BLOCKER_POOL 10
41+
42+
int main(int argc, char **argv)
43+
{
44+
if (argc < 2) {
45+
printf("Usage: %s <input>\n", argv[0]);
46+
exit(-1);
47+
}
48+
49+
const char *input = argv[1];
50+
51+
/* structures managers */
52+
struct upump_mgr *upump_mgr =
53+
upump_ev_mgr_alloc_default(UPUMP_POOL, UPUMP_BLOCKER_POOL);
54+
assert(upump_mgr != NULL);
55+
struct umem_mgr *umem_mgr = umem_pool_mgr_alloc_simple(UMEM_POOL);
56+
struct udict_mgr *udict_mgr =
57+
udict_inline_mgr_alloc(UDICT_POOL_DEPTH, umem_mgr, -1, -1);
58+
struct uref_mgr *uref_mgr =
59+
uref_std_mgr_alloc(UREF_POOL_DEPTH, udict_mgr, 0);
60+
udict_mgr_release(udict_mgr);
61+
62+
struct uclock *uclock = uclock_std_alloc(0);
63+
64+
/* probes */
65+
struct uprobe *uprobe;
66+
uprobe = uprobe_stdio_alloc(NULL, stderr, UPROBE_LOG_DEBUG);
67+
assert(uprobe != NULL);
68+
uprobe = uprobe_uref_mgr_alloc(uprobe, uref_mgr);
69+
assert(uprobe != NULL);
70+
uprobe = uprobe_upump_mgr_alloc(uprobe, upump_mgr);
71+
assert(uprobe != NULL);
72+
uprobe = uprobe_ubuf_mem_alloc(uprobe, umem_mgr, UBUF_POOL_DEPTH,
73+
UBUF_SHARED_POOL_DEPTH);
74+
assert(uprobe != NULL);
75+
uprobe = uprobe_uclock_alloc(uprobe, uclock);
76+
assert(uprobe != NULL);
77+
78+
uref_mgr_release(uref_mgr);
79+
upump_mgr_release(upump_mgr);
80+
umem_mgr_release(umem_mgr);
81+
82+
/* pipes */
83+
84+
struct upipe_mgr *upipe_pcap_src_mgr = upipe_pcap_src_mgr_alloc();
85+
struct upipe *upipe_src = upipe_void_alloc(upipe_pcap_src_mgr,
86+
uprobe_pfx_alloc(uprobe_use(uprobe), UPROBE_LOG_DEBUG, "pcap"));
87+
upipe_mgr_release(upipe_pcap_src_mgr);
88+
89+
upipe_attach_uclock(upipe_src);
90+
91+
struct upipe_mgr *upipe_null_mgr = upipe_null_mgr_alloc();
92+
struct upipe *upipe = upipe_void_alloc_output(upipe_src, upipe_null_mgr,
93+
uprobe_pfx_alloc(uprobe_use(uprobe), UPROBE_LOG_DEBUG, "null"));
94+
upipe_mgr_release(upipe_null_mgr);
95+
upipe_release(upipe);
96+
97+
if (!ubase_check(upipe_set_uri(upipe_src, input))) {
98+
fprintf(stderr, "invalid input\n");
99+
return EXIT_FAILURE;
100+
}
101+
102+
uprobe_release(uprobe);
103+
104+
/* main loop */
105+
upump_mgr_run(upump_mgr, NULL);
106+
107+
uclock_release(uclock);
108+
upipe_release(upipe_src);
109+
110+
return 0;
111+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright (C) 2025 Open Broadcast Systems Ltd
3+
*
4+
* Authors: Rafaël Carré
5+
*
6+
* SPDX-License-Identifier: MIT
7+
*/
8+
9+
/** @file
10+
* @short Upipe module to output data from a pcap
11+
*/
12+
13+
#ifndef _UPIPE_PCAP_UPIPE_PCAP_SRC_H_
14+
# define _UPIPE_PCAP_UPIPE_PCAP_SRC_H_
15+
16+
#ifdef __cplusplus
17+
extern "C" {
18+
#endif
19+
20+
#define UPIPE_PCAP_SRC_SIGNATURE UBASE_FOURCC('p','c','a','p')
21+
22+
struct upipe_mgr *upipe_pcap_src_mgr_alloc(void);
23+
24+
#ifdef __cplusplus
25+
}
26+
#endif
27+
28+
#endif

lib/Build.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ subdirs = \
1919
upipe-netmap \
2020
upipe-openssl \
2121
upipe-osx \
22+
upipe-pcap \
2223
upipe-pthread \
2324
upipe-speexdsp \
2425
upipe-swresample \

lib/upipe-pcap/Build.mk

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
lib-targets = libupipe_pcap
2+
3+
libupipe_pcap-desc = pcap file source
4+
libupipe_pcap-so-version = 1.0.0
5+
libupipe_pcap-includes = upipe_pcap_src.h
6+
libupipe_pcap-src = upipe_pcap_src.c
7+
libupipe_pcap-libs = libupipe libpcap bitstream

0 commit comments

Comments
 (0)