Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  demuxmedia.cpp

  Sprache: C
 


#include <unistd.h>

#include "demuxmedia.h"

DemuxMedia::DemuxMedia(QObject *parent, QQueue<MediaPacket *> *videoQueue,
                       void *channel, int stream_id) : QObject(parent)
{
    this->channel = channel;
    this->stream_id = stream_id;
    this->vcrFlag = 0;
    this->elapsedTime = 0;
    this->la_seekPos = -1;
    this->isStopped = 0;
    this->pausedTime = 0;
    this->videoQueue = videoQueue;

    playVideo = new PlayVideo(NULL, videoQueue, &sendMutex, channel, 10124);
    playVideoThread = new QThread(this);
    connect(playVideoThread, SIGNAL(started()), playVideo, SLOT(play()));
    playVideo->moveToThread(playVideoThread);

    playVideoThread->start();

}

void DemuxMedia::setVcrOp(int op)
{
    vcrMutex.lock();
    vcrFlag = op;
    vcrMutex.unlock();
    if (op == VCR_STOP)
    {
        clear();
    }
}

int DemuxMedia::clear()
{
    sendMutex.lock();
    videoQueue->clear();
    sendMutex.unlock();
    return 0;
}

void DemuxMedia::startDemuxing()
{
    MediaPacket *mediaPkt;
    int          is_video_frame;
    int          rv;

    while (1)
    {
        vcrMutex.lock();
        switch (vcrFlag)
        {
        case VCR_PLAY:
            vcrFlag = 0;
            vcrMutex.unlock();
            if (pausedTime)
            {
                elapsedTime = av_gettime() - pausedTime;
                pausedTime = 0;
            }
            isStopped = false;
            continue;
            break;

        case VCR_PAUSE:
            vcrMutex.unlock();
            if (!pausedTime)
            {
                /* save amount of video played so far */
                pausedTime = av_gettime() - elapsedTime;
            }
            usleep(1000 * 100);
            isStopped = false;
            continue;
            break;

        case VCR_STOP:
            vcrMutex.unlock();

            if (isStopped)
            {
                usleep(1000 * 100);
                continue;
            }
            elapsedTime = 0;
            pausedTime = 0;
            la_seekPos = -1;
            xrdpvr_seek_media(00);
            isStopped = true;
            continue;
            break;

        default:
            vcrMutex.unlock();
            break;
        }

        mediaPkt = new MediaPacket;
        rv = xrdpvr_get_frame(&mediaPkt->av_pkt,
                              &is_video_frame,
                              &mediaPkt->delay_in_us);
        if (rv < 0)
        {
            /* looks like we reached end of file */
            delete mediaPkt;
            usleep(1000 * 100);
            xrdpvr_seek_media(00);
            this->elapsedTime = 0;
            continue;
        }

        if (is_video_frame)
        {
            sendMutex.lock();
#if 1
            videoQueue->enqueue(mediaPkt);
#else
            send_video_pkt(channel, stream_id, mediaPkt->av_pkt);
            delete mediaPkt;
#endif
            sendMutex.unlock();
        }
        else
        {
            int frame;
            sendMutex.lock();
            send_audio_pkt(channel, stream_id, mediaPkt->av_pkt);
            sendMutex.unlock();
            xrdpvr_read_ack(channel, &frame);
            delete mediaPkt;
        }

        updateMediaPos();
        if (elapsedTime == 0)
        {
            elapsedTime = av_gettime();
        }

        /* time elapsed in 1/100th sec units since play started */
        emit onElapsedtime((av_gettime() - elapsedTime) / 10000);


    } /* end while (1) */
}

void DemuxMedia::onMediaSeek(int value)
{
    posMutex.lock();
    la_seekPos = value;
    posMutex.unlock();
}

void DemuxMedia::updateMediaPos()
{
    posMutex.lock();
    if (la_seekPos >= 0)
    {
        xrdpvr_seek_media(la_seekPos, 0);
        elapsedTime = av_gettime() - la_seekPos * 1000000;
        la_seekPos = -1;
    }
    posMutex.unlock();
}

Messung V0.5 in Prozent
C=96 H=100 G=97

¤ Dauer der Verarbeitung: 0.10 Sekunden  (vorverarbeitet am  2026-07-10) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik