-
Notifications
You must be signed in to change notification settings - Fork 0
/
XVideoThread.cpp
120 lines (107 loc) · 2.56 KB
/
XVideoThread.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include "XVideoThread.h"
#include "XDecode.h"
#include <iostream>
using namespace std;
XVideoThread::XVideoThread()
{
}
XVideoThread::~XVideoThread()
{
}
void XVideoThread::run() {
cout << "XVideoThread::run" << endl;
while (!isExit) {
vmux.lock();
if ( isPause ) {
vmux.unlock();
msleep(5);
continue;
}
// 音视频同步
if ( synpts > 0 && synpts < decode->pts ) {
vmux.unlock();
msleep(1);
continue;
}
// // 没有数据
// if ( packs.empty() || !decode ) {
// vmux.unlock();
// msleep(1);
// continue;
// }
// AVPacket *pkt = packs.front();
// packs.pop_front();
AVPacket *pkt = pop();
bool re = decode->send(pkt);
if ( !re ) {
vmux.unlock();
msleep(1);
continue;
}
// 一次send 多次recv
while (!isExit) {
AVFrame *frame = decode->recv();
if ( !frame ) {
break;
}
// 显示视频
if ( call ) {
call->repaint(frame);
}
}
vmux.unlock();
}
cout << "XVideoThread::run---end" << endl;
}
// 打开,不管成功与否都清理
bool XVideoThread::open(AVCodecParameters *para, IVideoCall *call, int width, int height) {
if ( !para ) {
return false;
}
vmux.lock();
// 清理队列
clear();
synpts = 0;
// 初始化显示窗口
this->call = call;
if ( call ) {
call->init(width, height);
}
vmux.unlock();
int re = true;
if ( !decode->open(para) ) {
cout << "video decode->open failed" << endl;
re = false;
}
cout << "XVideoThread::open success!: " << re << endl;
return re;
}
void XVideoThread::setPause(bool isPause) {
vmux.lock();
this->isPause = isPause;
vmux.unlock();
}
// 解码pts,如果接收到的解码数据pts > seekPts,return true,并且显示画面
bool XVideoThread::repaintPts(AVPacket *pkt, long long seekPts) {
vmux.lock();
bool re = decode->send(pkt);
if ( !re ) {
vmux.unlock();
return true;
} // 表示结束解码
AVFrame *frame = decode->recv();
if ( !frame ) {
vmux.unlock();
return false;
}
if ( decode->pts >= seekPts ) {
if ( call ) {
call->repaint(frame);
}
vmux.unlock();
return true;
}
XFreeFrame(&frame);
vmux.unlock();
return false;
}