A couple of other points, here is the structure of a transport packet as given by EyeTV:

typedef struct {
        unsigned long                   sync_byte : 8,
                                                        
transport_error_indicator : 1,
                                                        
payload_unit_start_indicator : 1,
                                                        transport_priority : 1,
                                                        PID : 13,
                                                        
transport_scrambling_control : 2,
                                                        
adaptation_field_control : 2,
                                                        continuity_counter : 4;
                                        
        unsigned char                   data[188-4];
                                        
} TransportStreamPacket;

And here is the code I'm currently using to access it:

static long PlexTVServerPacketsArrived(PlexTVServerGlobals *globals, EyeTVPluginDeviceID deviceID, long **packets, long packetsCount)
{
        long            result = 0;
        int             i, j, isNewPID;
        TransportStreamPacket *packet;
        
        if (globals)
        {
                DeviceInfo              *deviceInfo = GetDeviceInfo(globals, 
deviceID);
                if (deviceInfo)
                {
                        char packetBuffer[sizeof(TransportStreamPacket)];
                        for (i = 0; i < packetsCount; i++)
                        {
                                packet          = 
(TransportStreamPacket*)packets[i];
                                isNewPID        = 1;
                                
                                /*
                                *       search for PID
                                */
                
                                for (j = 0; j < deviceInfo->pidsCount; j++)
                                {
                                        if (packet->PID == deviceInfo->pids[j])
                                        {
                                                isNewPID = 0;
                                                break;
                                        }
                                }
                                
                                /*
                                *       add new PIDs to the DeviceInfo
                                */
                                if (isNewPID)
                                {
#ifdef TVDBG_VERBOSE
printf ("PlexTVServer: SamplePacketsArrived, newPID = %6li\n", packet->PID);
#endif
                                        if (deviceInfo->pidsCount < MAX_PIDS)
                                        {
                                                
deviceInfo->pids[deviceInfo->pidsCount++] = packet->PID;
                                        }
                                }
                                //stream packets to RTSP server
                                memcpy(packetBuffer, packet, 
sizeof(TransportStreamPacket));
write(streamfd[STREAM_INPUT], packetBuffer, sizeof(TransportStreamPacket));
                        }
//void *packetBuffer = malloc(packetsCount * sizeof(TransportStreamPacket)); //memcpy(packetBuffer, packets, sizeof(TransportStreamPacket) * packetsCount); //write(streamfd[STREAM_INPUT], packetBuffer, sizeof(TransportStreamPacket) * packetsCount);
                        //free(packetBuffer);
                        globals->packetCount+=packetsCount;
#ifdef TVDBG_VERBOSE
                        printf("Packetcount: %lli\n", globals->packetCount);
#endif
                }
        }
        
        return result;
}

According to the EyeTV documentation, the **packets array is the actual data coming from the card, rather than a copy, so it seems to be quite sensitive to interference, hence copying the packets before piping them to the server.
_______________________________________________
live-devel mailing list
live-devel@lists.live555.com
http://lists.live555.com/mailman/listinfo/live-devel

Reply via email to