OSDN Git Service

f641aedc9ba83d354424a769f6a3e3a541a33c62
[csp-qt/common_source_project-fm7.git] / source / src / qt / gui / tab_movie_h264.cpp
1 #include <QHBoxLayout>
2 #include <QVBoxLayout>
3 #include <QGridLayout>
4 #include <QWidget>
5 #include <QPushButton>
6 #include <QSlider>
7 #include <QComboBox>
8 #include <QLabel>
9 #include <QApplication>
10
11 #include "tab_movie_h264.h"
12 #include "dialog_movie.h"
13 #include "../avio/movie_saver.h"
14 #include "../../config.h"
15
16 CSP_TabMovieH264::CSP_TabMovieH264(MOVIE_SAVER *ms, CSP_DialogMovie *parent_window,  USING_FLAGS *p, QWidget *parent) : QWidget(parent)
17 {
18         QString tmps;
19         using_flags = p;
20         p_wid = parent;
21         p_movie = ms;
22         p_window = parent_window;
23
24         video_maxq = config.video_h264_maxq;
25         video_minq = config.video_h264_minq;
26
27         label_video_bframes = new QLabel(QApplication::translate("MainWindow", "Max B Frames", 0), this);
28         combo_video_bframes = new QComboBox(this);
29         label_video_b_adapt = new QLabel(QApplication::translate("MainWindow", "B Adaption", 0), this);
30         combo_video_b_adapt = new QComboBox(this);
31         label_video_subme = new QLabel(QApplication::translate("MainWindow", "Subpixel motion estimate", 0), this);
32         combo_video_subme = new QComboBox(this);
33
34         // Video bitrates
35         label_video_bitrate = new QLabel(QApplication::translate("MainWindow", "Bitrate", 0), this);
36         combo_video_bitrate = new QComboBox(this);
37         combo_video_bitrate->addItem(QString::fromUtf8("128Kbps"), 128);        
38         combo_video_bitrate->addItem(QString::fromUtf8("256Kbps"), 256);
39         combo_video_bitrate->addItem(QString::fromUtf8("300Kbps"), 300);
40         combo_video_bitrate->addItem(QString::fromUtf8("512Kbps"), 512);
41         combo_video_bitrate->addItem(QString::fromUtf8("600Kbps"), 600);
42         combo_video_bitrate->addItem(QString::fromUtf8("768Kbps"), 768);
43         combo_video_bitrate->addItem(QString::fromUtf8("900Kbps"), 900);
44         combo_video_bitrate->addItem(QString::fromUtf8("1000Kbps"), 1000);
45         combo_video_bitrate->addItem(QString::fromUtf8("1200Kbps"), 1200);
46         combo_video_bitrate->addItem(QString::fromUtf8("1500Kbps"), 1500);
47         combo_video_bitrate->addItem(QString::fromUtf8("1800Kbps"), 1800);
48         combo_video_bitrate->addItem(QString::fromUtf8("3000Kbps"), 3000);
49         combo_video_bitrate->addItem(QString::fromUtf8("4500Kbps"), 4500);
50         for(int i = 0; i < combo_video_bitrate->count(); i++) {
51                 int br = combo_video_bitrate->itemData(i).toInt();
52                 if(br == config.video_h264_bitrate) {
53                         combo_video_bitrate->setCurrentIndex(i);
54                 }
55         }
56         connect(combo_video_bitrate, SIGNAL(activated(int)), this, SLOT(do_set_video_bitrate(int)));
57         video_bitrate = config.video_h264_bitrate;
58
59         // Video bframes
60         combo_video_bframes->addItem(QString::fromUtf8("0"), 0);
61         combo_video_bframes->addItem(QString::fromUtf8("1"), 1);
62         combo_video_bframes->addItem(QString::fromUtf8("2"), 2);
63         combo_video_bframes->addItem(QString::fromUtf8("3"), 3);
64         combo_video_bframes->addItem(QString::fromUtf8("4"), 4);
65         combo_video_bframes->addItem(QString::fromUtf8("5"), 5);
66         combo_video_bframes->addItem(QString::fromUtf8("6"), 6);
67         combo_video_bframes->addItem(QString::fromUtf8("7"), 7);
68         combo_video_bframes->addItem(QString::fromUtf8("8"), 8);
69         for(int i = 0; i < combo_video_bframes->count(); i++) {
70                 int br = combo_video_bframes->itemData(i).toInt();
71                 if(br == config.video_h264_bframes) {
72                         combo_video_bframes->setCurrentIndex(i);
73                 }
74         }
75         video_bframes = config.video_h264_bframes;
76         connect(combo_video_bframes, SIGNAL(activated(int)), this, SLOT(do_set_bframes(int)));
77
78         // B adapt
79         combo_video_b_adapt->addItem(QApplication::translate("MainWindow", "None", 0), 0);
80         combo_video_b_adapt->addItem(QApplication::translate("MainWindow", "Fast", 0), 1);
81         combo_video_b_adapt->addItem(QApplication::translate("MainWindow", "Optimal (Slow with high B-Frames)", 0), 2);
82         for(int i = 0; i < combo_video_b_adapt->count(); i++) {
83                 int br = combo_video_b_adapt->itemData(i).toInt();
84                 if(br == config.video_h264_b_adapt) {
85                         combo_video_b_adapt->setCurrentIndex(i);
86                 }
87         }
88         video_b_adapt = config.video_h264_b_adapt;
89         connect(combo_video_b_adapt, SIGNAL(activated(int)), this, SLOT(do_set_b_adapt(int)));
90
91         slider_qmin = new QSlider(Qt::Horizontal, this);
92         slider_qmin->setMinimum(0);
93         slider_qmin->setMaximum(63);
94         slider_qmin->setValue(config.video_h264_minq);
95         label_qmin_val = new QLabel(this);
96         tmps.setNum(config.video_h264_minq);
97         label_qmin_val->setText(tmps);
98         label_qmin_name = new QLabel(QString::fromUtf8("QP Min"), this);
99         video_minq = config.video_h264_minq;
100         connect(slider_qmin, SIGNAL(valueChanged(int)), this, SLOT(do_set_qmin(int)));
101                 
102         slider_qmax = new QSlider(Qt::Horizontal, this);
103         slider_qmax->setMinimum(0);
104         slider_qmax->setMaximum(63);
105         slider_qmax->setValue(config.video_h264_maxq);
106         label_qmax_val = new QLabel(this);
107         tmps.setNum(config.video_h264_maxq);
108         label_qmax_val->setText(tmps);
109         label_qmax_name = new QLabel(QString::fromUtf8("QP Max"), this);
110         connect(slider_qmax, SIGNAL(valueChanged(int)), this, SLOT(do_set_qmax(int)));
111         video_maxq = config.video_h264_maxq;
112         
113         // Subme
114         combo_video_subme->addItem(QApplication::translate("MainWindow", "RD mode decision for I/P-frames", 0), 6);
115         combo_video_subme->addItem(QApplication::translate("MainWindow", "RD mode decision for all frames", 0), 7);
116         combo_video_subme->addItem(QApplication::translate("MainWindow", "RD refinement for  I/P-frames", 0), 8);
117         combo_video_subme->addItem(QApplication::translate("MainWindow", "RD refinement for all frames", 0), 9);
118         combo_video_subme->addItem(QApplication::translate("MainWindow", "QP-RD", 0), 10); // Trellis 2, admode > 0
119         combo_video_subme->addItem(QApplication::translate("MainWindow", "Full RD: disable all early terminations", 0), 11);
120         for(int i = 0; i < combo_video_subme->count(); i++) {
121                 int br = combo_video_subme->itemData(i).toInt();
122                 if(br == config.video_h264_subme) {
123                         combo_video_subme->setCurrentIndex(i);
124                 }
125         }
126         video_subme = config.video_h264_subme;
127         connect(combo_video_subme, SIGNAL(activated(int)), this, SLOT(do_set_subme(int)));
128                 
129         label_title = new QLabel(QApplication::translate("MainWindow", "Set H.264 parameter.", 0), this);
130         grid_layout = new QGridLayout(this);
131
132         grid_layout->addWidget(label_title, 0, 0);
133         
134         grid_layout->addWidget(label_qmin_name, 1, 0);
135         grid_layout->addWidget(label_qmin_val, 1, 3);
136         grid_layout->addWidget(slider_qmin, 2, 0, 1, 4);
137         grid_layout->addWidget(label_qmax_name, 3, 0);
138         grid_layout->addWidget(label_qmax_val, 3, 3);
139         grid_layout->addWidget(slider_qmax, 4, 0, 1, 4);
140         grid_layout->addWidget(label_video_bitrate, 5, 0);
141         grid_layout->addWidget(combo_video_bitrate, 5, 1);
142         
143         
144         grid_layout->addWidget(label_video_bframes, 6, 0);
145         grid_layout->addWidget(combo_video_bframes, 6, 1);
146         
147         grid_layout->addWidget(label_video_b_adapt, 6, 2);
148         grid_layout->addWidget(combo_video_b_adapt, 6, 3);
149         
150         grid_layout->addWidget(label_video_subme, 7, 0);
151         grid_layout->addWidget(combo_video_subme, 7, 1);
152         
153         this->setLayout(grid_layout);
154
155         connect(this, SIGNAL(sig_video_add_option(QString, QString)), p_movie, SLOT(do_add_option(QString, QString)));
156         connect(this, SIGNAL(sig_set_video_bitrate(int)), p_movie, SLOT(do_set_video_bitrate(int)));
157         this->show();
158 }
159
160
161 CSP_TabMovieH264::~CSP_TabMovieH264()
162 {
163 }
164
165 void CSP_TabMovieH264::do_set_codecs(void)
166 {
167         QString value;
168         // See:
169         // https://libav.org/avconv.html#Video-Options
170         config.video_h264_bitrate = video_bitrate;
171
172         config.video_h264_maxq = video_maxq;
173         config.video_h264_minq = video_minq;
174         config.video_h264_bframes = video_bframes;
175         config.video_h264_b_adapt = video_b_adapt;
176         config.video_h264_subme = video_subme;
177 }
178
179 void CSP_TabMovieH264::do_set_qmin(int n)
180 {
181         if(n < 0) n = 0;
182         if(n > 63) n = 63;
183         QString tmps;
184         video_minq = n;
185         tmps.setNum(n);
186         label_qmin_val->setText(tmps);
187 }
188
189 void CSP_TabMovieH264::do_set_qmax(int n)
190 {
191         if(n < 0) n = 0;
192         if(n > 63) n = 63;
193         
194         QString tmps;
195         video_maxq = n;
196         tmps.setNum(n);
197         label_qmax_val->setText(tmps);
198 }
199
200 void CSP_TabMovieH264::do_set_bframes(int n)
201 {
202         int val = combo_video_bframes->itemData(n).toInt();
203         if(val < 0) val = 0;
204         if(val > 10) val = 10;
205         video_bframes = val;
206 }
207
208 void CSP_TabMovieH264::do_set_video_bitrate(int n)
209 {
210         int val = combo_video_bitrate->itemData(n).toInt();
211         if(val < 64) val = 64;
212         video_bitrate = val;
213 }
214
215 void CSP_TabMovieH264::do_set_b_adapt(int n)
216 {
217         int val = combo_video_b_adapt->itemData(n).toInt();
218         if(val < 0) val = 0;
219         if(val > 2) val = 2;
220         video_b_adapt = val;
221 }
222
223 void CSP_TabMovieH264::do_set_subme(int n)
224 {
225         int val = combo_video_subme->itemData(n).toInt();
226         if(val < 4) val = 4;
227         if(val > 11) val = 11;
228         video_subme = val;
229 }