summaryrefslogtreecommitdiff
path: root/src/multiplexer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/multiplexer.cc')
-rw-r--r--src/multiplexer.cc52
1 files changed, 12 insertions, 40 deletions
diff --git a/src/multiplexer.cc b/src/multiplexer.cc
index d2aecfc..0b54bf8 100644
--- a/src/multiplexer.cc
+++ b/src/multiplexer.cc
@@ -68,37 +68,27 @@ static double picture_rate_index[16] = {
RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED
};
*/
-
Multiplexer::Multiplexer(File *f, Info *i, volatile bool *r,
- FramePriorityQueue *v_q, pthread_mutex_t *v_m, sem_t *v_s,
- FramePriorityQueue *a_q, pthread_mutex_t *a_m, sem_t *a_s)
+ ThreadSafeQueuePriority *video_q,
+ ThreadSafeQueuePriority *audio_q)
{
running = r;
file = f;
info = i;
- queue[TYPE_VIDEO] = v_q;
- queue[TYPE_AUDIO] = a_q;
-
- sem[TYPE_VIDEO] = v_s;
- sem[TYPE_AUDIO] = a_s;
-
- mutex[TYPE_VIDEO] = v_m;
- mutex[TYPE_AUDIO] = a_m;
-
frame[TYPE_VIDEO] = NULL;
- frame[TYPE_AUDIO] = NULL;
+ written[TYPE_VIDEO] = 0.0;
- frame_number[TYPE_VIDEO] = 0;
- frame_number[TYPE_AUDIO] = 0;
+ frame[TYPE_AUDIO] = NULL;
+ written[TYPE_AUDIO] = 0.0;
- write_system_header = 0;
write_audio_packet = 0;
+ write_system_header = 0;
audio_header_read = false;
- written[TYPE_VIDEO] = 0.0;
- written[TYPE_AUDIO] = 0.0;
+ queue[TYPE_VIDEO] = video_q;
+ queue[TYPE_AUDIO] = audio_q;
SCR = 3904;//0x40010003LL;//0x1E80;
@@ -111,29 +101,11 @@ Multiplexer::~Multiplexer()
Frame *Multiplexer::getFrame(StreamType type)
{
- Frame *tmpframe;
- Frame *frame = NULL;
-
- sem_wait(sem[type]);
-
- while( frame == NULL ) {
- // Lock output mutex
- pthread_mutex_lock( mutex[type] );
- tmpframe = queue[type]->top();
-
- if(tmpframe && tmpframe->number == frame_number[type] ) {
- queue[type]->pop();
- frame = tmpframe;
- frame_number[type]++;
- read[type] = 0;
- }
-
- pthread_mutex_unlock( mutex[type] );
- // Unlock output mutex
+ info->info("Get %s Frame", type==TYPE_AUDIO?"Audio\0":"Video\0");
+
+ read[type] = 0;
- sleep_0_2_frame();
- }
- return frame;
+ return queue[type]->pop();
}
int Multiplexer::read_stream(char *buf, unsigned int size, StreamType type)