⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sicapture.c

📁 Dvbstreamer 用在解析MPTS的部分内容
💻 C
字号:
/*Copyright (C) 2006  Adam CharrettThis program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; either version 2of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USAsicapture.c
Plugin to capture only PSI/SI information to an MRL.
*/#include <stdio.h>#include <stdlib.h>#include <stdint.h>#include <string.h>#include <stdint.h>#include <time.h>
#include "main.h"
#include "plugin.h"#include "multiplexes.h"
#include "services.h"
#include "tuning.h"
#include "cache.h"
#include "logging.h"
#include "deliverymethod.h"

/*******************************************************************************
* Defines                                                                      *
*******************************************************************************/
#define MAX_EITS 128 /* Maximum number of EIT tables (PIDs) */
#define MAX_ETTS 128 /* Maximum number of ETT tables (PIDs) */

/*******************************************************************************
* Prototypes                                                                   *
*******************************************************************************/
static void InitFilter(PIDFilter_t *filter);
static void DeinitFilter(PIDFilter_t *filter);
static void NewMGT(dvbpsi_atsc_mgt_t *newMGT);
static int FilterPacket(PIDFilter_t *pidfilter, void *arg, uint16_t pid, TSPacket_t *packet);

static void CommandEnableSICapture(int argc, char **argv);
static void CommandDisableSICapture(int argc, char **argv);

/*******************************************************************************
* Global variables                                                             ********************************************************************************/static PluginFilter_t CaptureFilter = {NULL, InitFilter, DeinitFilter};
static const char SICAPTURE[] = "SICapture";

static int EventInfoTableCount = 0;
static uint16_t EventInfoTablePIDs[MAX_EITS];

static int ExtendedTextTableCount = 0;
static uint16_t ExtendedTextTablePIDs[MAX_ETTS];

static uint16_t channelETT = 0;

/******************************************************************************** Plugin Setup                                                                 ********************************************************************************/#ifdef __CYGWIN__#define PluginInterface SICapturePluginInterface
#endifPLUGIN_FEATURES(    PLUGIN_FEATURE_FILTER(CaptureFilter),
    PLUGIN_FEATURE_MGTPROCESSOR(NewMGT)    );
PLUGIN_COMMANDS(    {
        "enablesicap",
        TRUE, 1, 1,
        "Enable the capture of PSI/SI data.",
        "enablesicap <mrl>\n"
        "Enables and sets the MRL to send captured PSI/SI packets to.",
        CommandEnableSICapture
    },
    {
        "disablesicap",
        TRUE, 0, 0,
        "Disable the capture of PSI/SI data.",
        "enablesicap <mrl>\n"
        "Disables the capture of PSI/SI packets.",
        CommandDisableSICapture
    }
    );

PLUGIN_INTERFACE_CF(
    PLUGIN_FOR_ALL,
    "SICapture", "0.1", 
    "Plugin to capture PSI/SI to an MRL.", 
    "charrea6@users.sourceforge.net"    );
/******************************************************************************** Filter Functions                                                             ********************************************************************************/static void InitFilter(PIDFilter_t *filter)
{    filter->name = "PSI/SI Capture";

    PIDFilterFilterPacketSet(filter, FilterPacket, NULL);   
}
static void DeinitFilter(PIDFilter_t *filter)
{    filter->enabled = FALSE;
}

static void NewMGT(dvbpsi_atsc_mgt_t *newMGT)
{    dvbpsi_atsc_mgt_table_t * table;    EventInfoTableCount = 0;
    ExtendedTextTableCount = 0;
    channelETT = 0;
    for (table = newMGT->p_first_table; table; table = table->p_next)    {
        if (table->i_type == 0x004)
        {
            channelETT = table->i_pid;
            LogModule(LOG_DEBUG, SICAPTURE, "Channel ETT (%04x)\n", channelETT);
        }
        if ((table->i_type >= 0x100) && (table->i_type <= 0x17f))        {            LogModule(LOG_DEBUG, SICAPTURE, "EIT %d (%04x)\n",table->i_type - 0x100, table->i_pid);
            EventInfoTablePIDs[EventInfoTableCount] = table->i_pid;
            EventInfoTableCount ++;
        }
        if ((table->i_type >= 0x200) && (table->i_type <= 0x27f))
        {            LogModule(LOG_DEBUG, SICAPTURE, "ETT %d (%04x)\n",table->i_type - 0x200, table->i_pid);
            ExtendedTextTablePIDs[ExtendedTextTableCount] = table->i_pid;
            ExtendedTextTableCount ++;
        }
    }}

static int FilterPacket(PIDFilter_t *pidfilter, void *arg, uint16_t pid, TSPacket_t *packet)
{
    int result = 0;
    int i;
    Multiplex_t *mux;

    /* Handle PAT */
    if (pid == 0)
    {
        result = 1;
    }

    /* Handle CAT */
    if (pid == 1)
    {
        result = 1;
    }
    
    /* Handle PMTs */
    if(result == 0)
    {
        mux = TuningCurrentMultiplexGet();
        if (mux)
        {
            int i;
            int count;
            Service_t **services;

            services = CacheServicesGet(&count);
            for (i = 0; i < count; i ++)
            {
                if (pid == services[i]->pmtPid)
                {
                    result =  1;
                    break;
                }
            }
            CacheServicesRelease();
            MultiplexRefDec(mux);
        }
    }

    /* Standard specific PIDs */    
    if (result == 0)
    {
        if (MainIsDVB())
        {
            switch(pid)
            {
                case 0x10: /* NIT, ST*/
                case 0x11: /* SDT, BAT, ST*/
                case 0x12: /* EIT, ST, CIT */
                case 0x13: /* RST, ST */
                case 0x14: /* TDT, TOT, ST */
                case 0x16: /* RNT */
                    result = 1;
                    break;
                default:
                    break;
            }
        }
        else
        {
            if (pid == 0x1ffb)
            {
                result = 1;
            }
            else
            {
                if (channelETT && (channelETT == pid))
                {
                    result = 1;
                }
                if (result == 0)
                {
                    for (i = 0; i < EventInfoTableCount; i ++)
                    {
                        if (EventInfoTablePIDs[i] == pid)
                        {
                            result = 1;
                            break;
                        }
                    }
                }
                if (result == 0)
                {
                    for (i = 0; i < ExtendedTextTableCount; i ++)
                    {
                        if (ExtendedTextTablePIDs[i] == pid)
                        {
                            result = 1;
                            break;
                        }
                    }
                }
                
            }
        }
    }
    return result;
}
/*******************************************************************************
* Command Functions                                                            *
*******************************************************************************/
static void CommandEnableSICapture(int argc, char **argv)
{
    if (DeliveryMethodManagerFind(argv[0], CaptureFilter.filter))
    {
        CommandPrintf("SI Capture started (%s)\n", argv[0]);
    }
    else
    {
        CommandPrintf("Failed to find handler for %s\n", argv[0]);
    }
    CaptureFilter.filter->enabled = TRUE;
}

static void CommandDisableSICapture(int argc, char **argv)
{
    CaptureFilter.filter->enabled = FALSE;
    DeliveryMethodManagerFree(CaptureFilter.filter);
    CommandPrintf("SI Capture stopped\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -