Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Passthrough original PAT/PMT packets to the passthrough muxer #255

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
26 changes: 13 additions & 13 deletions src/dvb/dvb_adapter.c
Expand Up @@ -1083,21 +1083,21 @@ dvb_adapter_input_dvr(void *aux)

/* sync */
if (tsb[i] == 0x47) {
int pid = (tsb[i+1] & 0x1f) << 8 | tsb[i+2];

if(tda->tda_table_filter[pid]) {
if(!(tsb[i+1] & 0x80)) { // Only dispatch to table parser if not error
dvb_table_feed_t *dtf = malloc(sizeof(dvb_table_feed_t));
memcpy(dtf->dtf_tsb, tsb + i, 188);
TAILQ_INSERT_TAIL(&tda->tda_table_feed, dtf, dtf_link);
wakeup_table_feed = 1;
}
} else {
LIST_FOREACH(t, &tda->tda_transports, s_active_link)
if(t->s_dvb_mux_instance == tda->tda_mux_current)
ts_recv_packet1(t, tsb + i, NULL);
int pid = (tsb[i+1] & 0x1f) << 8 | tsb[i+2];

if(tda->tda_table_filter[pid]) {
if(!(tsb[i+1] & 0x80)) { // Only dispatch to table parser if not error
dvb_table_feed_t *dtf = malloc(sizeof(dvb_table_feed_t));
memcpy(dtf->dtf_tsb, tsb + i, 188);
TAILQ_INSERT_TAIL(&tda->tda_table_feed, dtf, dtf_link);
wakeup_table_feed = 1;
}
}

LIST_FOREACH(t, &tda->tda_transports, s_active_link)
if(t->s_dvb_mux_instance == tda->tda_mux_current)
ts_recv_packet1(t, tsb + i, NULL);

i += 188;
r -= 188;

Expand Down
1 change: 1 addition & 0 deletions src/dvr/dvr.h
Expand Up @@ -66,6 +66,7 @@ extern struct dvr_entry_list dvrentries;
#define DVR_CLEAN_TITLE 0x100
#define DVR_TAG_FILES 0x200
#define DVR_SKIP_COMMERCIALS 0x400
#define DVR_REWRITE_PATPMT 0x800

typedef enum {
DVR_PRIO_IMPORTANT,
Expand Down
4 changes: 4 additions & 0 deletions src/dvr/dvr_db.c
Expand Up @@ -994,6 +994,9 @@ dvr_init(void)

cfg->dvr_mc = htsmsg_get_u32_or_default(m, "container", MC_MATROSKA);

if(!htsmsg_get_u32(m, "rewrite-patpmt", &u32) && u32)
cfg->dvr_flags |= DVR_REWRITE_PATPMT;

htsmsg_get_s32(m, "pre-extra-time", &cfg->dvr_extra_time_pre);
htsmsg_get_s32(m, "post-extra-time", &cfg->dvr_extra_time_post);
htsmsg_get_u32(m, "retention-days", &cfg->dvr_retention_days);
Expand Down Expand Up @@ -1182,6 +1185,7 @@ dvr_save(dvr_config_t *cfg)
htsmsg_add_str(m, "config_name", cfg->dvr_config_name);
htsmsg_add_str(m, "storage", cfg->dvr_storage);
htsmsg_add_u32(m, "container", cfg->dvr_mc);
htsmsg_add_u32(m, "rewrite-patpmt", !!(cfg->dvr_flags & DVR_REWRITE_PATPMT));
htsmsg_add_u32(m, "retention-days", cfg->dvr_retention_days);
htsmsg_add_u32(m, "pre-extra-time", cfg->dvr_extra_time_pre);
htsmsg_add_u32(m, "post-extra-time", cfg->dvr_extra_time_post);
Expand Down
7 changes: 6 additions & 1 deletion src/dvr/dvr_rec.c
Expand Up @@ -287,8 +287,13 @@ dvr_rec_start(dvr_entry_t *de, const streaming_start_t *ss)
const streaming_start_component_t *ssc;
int i;
dvr_config_t *cfg = dvr_config_find_by_name_default(de->de_config_name);
muxer_container_type_t mc;
muxer_config_t m_cfg;

de->de_mux = muxer_create(de->de_mc);
mc = de->de_mc;
m_cfg.rewrite_patpmt = !!(cfg->dvr_flags & DVR_REWRITE_PATPMT);

de->de_mux = muxer_create(mc, &m_cfg);
if(!de->de_mux) {
dvr_rec_fatal_error(de, "Unable to create muxer");
return -1;
Expand Down
8 changes: 4 additions & 4 deletions src/muxer.c
Expand Up @@ -231,18 +231,18 @@ muxer_container_mime2type(const char *str)
* Create a new muxer
*/
muxer_t*
muxer_create(muxer_container_type_t mc)
muxer_create(muxer_container_type_t mc, muxer_config_t *m_cfg)
{
muxer_t *m;

m = pass_muxer_create(mc);
m = pass_muxer_create(mc, m_cfg);

if(!m)
m = tvh_muxer_create(mc);
m = tvh_muxer_create(mc, m_cfg);

#if CONFIG_LIBAV
if(!m)
m = lav_muxer_create(mc);
m = lav_muxer_create(mc, m_cfg);
#endif

if(!m)
Expand Down
8 changes: 7 additions & 1 deletion src/muxer.h
Expand Up @@ -30,6 +30,12 @@ typedef enum {
MC_RAW = 5,
} muxer_container_type_t;

/* Muxer configuration used when creating a muxer. */
typedef struct muxer_config {
/* Options only for passthrough muxer */
int rewrite_patpmt;

} muxer_config_t;

struct muxer;
struct streaming_start;
Expand Down Expand Up @@ -72,7 +78,7 @@ const char* muxer_container_suffix(muxer_container_type_t mc, int vid
int muxer_container_list(htsmsg_t *array);

// Muxer factory
muxer_t *muxer_create(muxer_container_type_t mc);
muxer_t *muxer_create(muxer_container_type_t mc, muxer_config_t *m_cfg);

// Wrapper functions
int muxer_open_file (muxer_t *m, const char *filename);
Expand Down
2 changes: 1 addition & 1 deletion src/muxer/muxer_libav.c
Expand Up @@ -467,7 +467,7 @@ lav_muxer_destroy(muxer_t *m)
* Create a new libavformat based muxer
*/
muxer_t*
lav_muxer_create(muxer_container_type_t mc)
lav_muxer_create(muxer_container_type_t mc, muxer_config_t *m_cfg)
{
const char *mux_name;
lav_muxer_t *lm;
Expand Down
2 changes: 1 addition & 1 deletion src/muxer/muxer_libav.h
Expand Up @@ -21,6 +21,6 @@

#include "muxer.h"

muxer_t* lav_muxer_create(muxer_container_type_t mc);
muxer_t* lav_muxer_create(muxer_container_type_t mc, muxer_config_t* m_cfg);

#endif