Skip to content

Commit 2cbd7cc

Browse files
Merge akamai:ZoneMinder into ai_server
2 parents e533074 + 841958d commit 2cbd7cc

File tree

8 files changed

+106
-56
lines changed

8 files changed

+106
-56
lines changed

src/zm_ffmpeg.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ static CodecData enc_codecs[] = {
7474
{ AV_CODEC_ID_H265, "hevc", "h265_ni_quadra_enc", AV_PIX_FMT_YUV420P, AV_PIX_FMT_NI_QUAD, AV_HWDEVICE_TYPE_NI_QUADRA, "-1", nullptr },
7575
{ AV_CODEC_ID_H265, "hevc", "h265_ni_quadra_enc", AV_PIX_FMT_YUV420P, AV_PIX_FMT_NI_QUAD, AV_HWDEVICE_TYPE_NI_QUADRA, "-1", nullptr },
7676
{ AV_CODEC_ID_H264, "h264", "h264_ni_quadra_enc", AV_PIX_FMT_YUV420P, AV_PIX_FMT_NI_QUAD, AV_HWDEVICE_TYPE_NI_QUADRA, "-1", nullptr },
77-
//{ AV_CODEC_ID_MJPEG, "mjpeg", "jpeg_ni_quadra_enc", AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_NI_QUAD, AV_HWDEVICE_TYPE_NI_QUADRA, "-1", nullptr },
77+
{ AV_CODEC_ID_MJPEG, "mjpeg", "jpeg_ni_quadra_enc", AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_NI_QUAD, AV_HWDEVICE_TYPE_NI_QUADRA, "-1", nullptr },
7878
#endif
7979
{ AV_CODEC_ID_H265, "hevc", "hevc_vaapi", AV_PIX_FMT_NV12, AV_PIX_FMT_VAAPI, AV_HWDEVICE_TYPE_VAAPI, nullptr, nullptr },
8080
{ AV_CODEC_ID_H265, "hevc", "hevc_qsv", AV_PIX_FMT_YUV420P, AV_PIX_FMT_QSV, AV_HWDEVICE_TYPE_QSV, nullptr, nullptr },

src/zm_ffmpeg_input.cpp

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ int FFmpeg_Input::Open(const char *filepath) {
6565

6666

6767
for (unsigned int i = 0; i < input_format_context->nb_streams; i += 1) {
68-
av_seek_frame(input_format_context, i, 0, AVSEEK_FLAG_FRAME);
68+
//av_seek_frame(input_format_context, i, 0, AVSEEK_FLAG_FRAME);
6969

7070
if (is_video_stream(input_format_context->streams[i])) {
7171
zm_dump_stream_format(input_format_context, i, 0, 0);
@@ -115,6 +115,7 @@ int FFmpeg_Input::Open(const char *filepath) {
115115
streams[i].context = nullptr;
116116
continue;
117117
}
118+
break;
118119
} // end foreach codec_data
119120

120121
if (!streams[i].context) {
@@ -221,26 +222,33 @@ AVFrame *FFmpeg_Input::get_frame(int stream_id) {
221222
Error("Unable to allocate frame.");
222223
return nullptr;
223224
}
224-
ret = zm_send_packet_receive_frame(context, frame.get(), *packet);
225-
if ( ret < 0 ) {
226-
Error("Unable to decode frame at frame %d: %d %s, continuing",
227-
streams[packet->stream_index].frame_count, ret, av_make_error_string(ret).c_str());
228-
frame = nullptr;
229-
continue;
225+
226+
// Since technically sending a packet can result in multiple frames (or buffered_frames) try receive_frame first.
227+
ret = avcodec_receive_frame(context, frame.get());
228+
Debug(1, "Ret from receive_frame ret: %d %s", ret, av_make_error_string(ret).c_str());
229+
if (ret == AVERROR(EAGAIN)) {
230+
// Perfectly normal
231+
} else if (ret < 0) {
232+
Error("Ret from receive_frame ret: %d %s", ret, av_make_error_string(ret).c_str());
233+
return nullptr;
230234
} else {
235+
frameComplete = true;
231236
if (is_video_stream(input_format_context->streams[packet->stream_index])) {
232237
zm_dump_video_frame(frame.get(), "resulting video frame");
233238
} else {
234239
zm_dump_frame(frame.get(), "resulting frame");
235240
}
241+
break;
236242
}
237243

238-
frameComplete = true;
239-
240-
if (is_video_stream(input_format_context->streams[packet->stream_index])) {
241-
zm_dump_video_frame(frame.get(), "resulting video frame");
242-
} else {
243-
zm_dump_frame(frame.get(), "resulting frame");
244+
ret = avcodec_send_packet(context, packet.get());
245+
if (ret == AVERROR(EAGAIN)) {
246+
Debug(2, "Unable to send packet %d %s", ret, av_make_error_string(ret).c_str());
247+
continue;
248+
}
249+
if (ret < 0) {
250+
Error("Unable to send packet %d %s", ret, av_make_error_string(ret).c_str());
251+
return nullptr;
244252
}
245253
} // end while !frameComplete
246254
return frame.get();

src/zm_videostore.cpp

Lines changed: 65 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ VideoStore::VideoStore(
7272
next_dts(nullptr),
7373
audio_next_pts(0),
7474
max_stream_index(-1),
75-
reorder_queue_size(1) {
75+
reorder_queue_size(0) {
7676
FFMPEGInit();
7777
swscale.init();
7878
opkt = av_packet_ptr{av_packet_alloc()};
@@ -301,19 +301,30 @@ bool VideoStore::open() {
301301
const AVDictionaryEntry *opts_level = av_dict_get(opts, "level", nullptr, AV_DICT_MATCH_CASE);
302302
if (opts_level) {
303303
video_out_ctx->level = std::stoul(opts_level->value);
304-
} else if (!video_out_ctx->level) {
305-
video_out_ctx->level = 32;
304+
//} else if (!video_out_ctx->level) {
305+
//video_out_ctx->level = 32;
306306
}
307307
const AVDictionaryEntry *opts_gop_size = av_dict_get(opts, "gop_size", nullptr, AV_DICT_MATCH_CASE);
308308
if (opts_gop_size) {
309309
video_out_ctx->gop_size = std::stoul(opts_gop_size->value);
310-
} else if (!video_out_ctx->gop_size) {
311-
video_out_ctx->gop_size = 12;
310+
//} else if (!video_out_ctx->gop_size) {
311+
//video_out_ctx->gop_size = 12;
312312
}
313-
zm_dump_codec(video_out_ctx);
314-
if (!video_out_ctx->bit_rate) {
315-
video_out_ctx->bit_rate = monitor->get_capture_bitrate();
313+
//zm_dump_codec(video_out_ctx);
314+
const AVDictionaryEntry *opts_bitrate = av_dict_get(opts, "bitrate", nullptr, AV_DICT_MATCH_CASE);
315+
if (opts_bitrate) {
316+
video_out_ctx->bit_rate = std::stoul(opts_bitrate->value);
317+
av_dict_set(&opts, "bitrate", nullptr, AV_DICT_MATCH_CASE);
318+
} else {
319+
opts_bitrate = av_dict_get(opts, "bit_rate", nullptr, AV_DICT_MATCH_CASE);
320+
if (opts_bitrate) {
321+
video_out_ctx->bit_rate = std::stoul(opts_bitrate->value);
322+
av_dict_set(&opts, "bit_rate", nullptr, AV_DICT_MATCH_CASE);
323+
}
316324
}
325+
//if (!video_out_ctx->bit_rate) {
326+
//video_out_ctx->bit_rate = monitor->get_capture_bitrate();
327+
//}
317328
zm_dump_codec(video_out_ctx);
318329

319330
// Don't have an input stream, so need to tell it what we are sending it, or are transcoding
@@ -322,8 +333,8 @@ bool VideoStore::open() {
322333
video_out_ctx->codec_type = AVMEDIA_TYPE_VIDEO;
323334

324335
if (video_out_ctx->codec_id == AV_CODEC_ID_H264) {
325-
video_out_ctx->bit_rate = 2000000;
326-
video_out_ctx->max_b_frames = 1;
336+
//video_out_ctx->bit_rate = 2000000;
337+
//video_out_ctx->max_b_frames = 1;
327338
} else if (video_out_ctx->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
328339
/* just for testing, we also add B frames */
329340
video_out_ctx->max_b_frames = 2;
@@ -345,6 +356,10 @@ bool VideoStore::open() {
345356
av_opt_set(video_out_ctx->priv_data, "enc", std::to_string(devid).c_str(), 0);
346357
}
347358
#endif
359+
const AVDictionaryEntry *xcoder_params = av_dict_get(opts, "xcoder-params", nullptr, AV_DICT_MATCH_CASE);
360+
if (xcoder_params) {
361+
av_opt_set(video_out_ctx->priv_data, "xcoder-params", xcoder_params->value, 0);
362+
}
348363

349364
if ((ret = avcodec_open2(video_out_ctx, video_out_codec, &opts)) < 0) {
350365
if (wanted_encoder != "" and wanted_encoder != "auto") {
@@ -495,6 +510,7 @@ bool VideoStore::open() {
495510
zm_dump_stream_format(oc, 0, 0, 1);
496511
if (audio_out_stream) zm_dump_stream_format(oc, 1, 0, 1);
497512

513+
av_dict_set(&opts, "xcoder-params", nullptr, AV_DICT_MATCH_CASE);
498514
const AVDictionaryEntry *movflags_entry = av_dict_get(opts, "movflags", nullptr, AV_DICT_MATCH_CASE);
499515
if (!movflags_entry) {
500516
Debug(1, "setting movflags to frag_keyframe+empty_moov+faststart");
@@ -1050,7 +1066,6 @@ int VideoStore::writePacket(const std::shared_ptr<ZMPacket> zm_pkt) {
10501066
Error("Unknown stream type in packet (%d)", zm_pkt->codec_type);
10511067
return -1;
10521068
}
1053-
Debug(1, "Queue for %d", stream_index);
10541069
auto &queue = reorder_queues[stream_index];
10551070
Debug(1, "Queue size for %d is %zu", stream_index, queue.size());
10561071

@@ -1154,23 +1169,27 @@ int VideoStore::writeVideoFramePacket(const std::shared_ptr<ZMPacket> zm_packet)
11541169
);
11551170
}
11561171
} else if (zm_packet->ai_frame) {
1157-
Debug(1, "Using ai_frame");
1172+
Debug(1, "Want ai_frame");
11581173
if (zm_packet->ai_frame->width == video_out_ctx->width
1159-
and
1160-
zm_packet->ai_frame->height == video_out_ctx->height
1161-
and
1162-
static_cast<AVPixelFormat>(zm_packet->ai_frame->format) == chosen_codec_data->sw_pix_fmt
1163-
) {
1164-
av_frame_ref(frame.get(), zm_packet->ai_frame.get());
1165-
} else {
1166-
frame = av_frame_ptr(zm_packet->get_out_frame(video_out_ctx->width, video_out_ctx->height, chosen_codec_data->sw_pix_fmt));
1167-
if (!frame) {
1168-
Error("Unable to allocate a frame");
1169-
return 0;
1170-
}
1171-
// Have in_frame.... may need to convert it to out_frame
1172-
swscale.Convert(zm_packet->ai_frame.get(), frame.get());
1174+
and
1175+
zm_packet->ai_frame->height == video_out_ctx->height
1176+
and
1177+
static_cast<AVPixelFormat>(zm_packet->ai_frame->format) == chosen_codec_data->sw_pix_fmt
1178+
) {
1179+
Debug(1, "Using ai_frame");
1180+
av_frame_ref(frame.get(), zm_packet->ai_frame.get());
1181+
} else {
1182+
Debug(1, "reating ai_frame");
1183+
frame = av_frame_ptr(zm_packet->get_out_frame(video_out_ctx->width, video_out_ctx->height, chosen_codec_data->sw_pix_fmt));
1184+
if (!frame) {
1185+
Error("Unable to allocate a frame");
1186+
return 0;
11731187
}
1188+
av_frame_copy_props(frame.get(), zm_packet->ai_frame.get());
1189+
1190+
// Have in_frame.... may need to convert it to out_frame
1191+
swscale.Convert(zm_packet->ai_frame.get(), frame.get());
1192+
}
11741193
} else if (zm_packet->in_frame) {
11751194
Debug(1, "Using in_frame");
11761195
if (zm_packet->in_frame->width == video_out_ctx->width
@@ -1181,16 +1200,18 @@ int VideoStore::writeVideoFramePacket(const std::shared_ptr<ZMPacket> zm_packet)
11811200
) {
11821201
av_frame_ref(frame.get(), zm_packet->in_frame.get());
11831202
} else {
1203+
Debug(1, "Scaling in_frame");
11841204
av_frame_ref(frame.get(), zm_packet->get_out_frame(video_out_ctx->width, video_out_ctx->height, chosen_codec_data->sw_pix_fmt));
11851205
// Have in_frame.... may need to convert it to out_frame
11861206
swscale.Convert(zm_packet->in_frame.get(), frame.get());
1207+
av_frame_copy_props(frame.get(), zm_packet->in_frame.get());
11871208
}
11881209
} // end if no in_frame
11891210
} // end if no out_frame
11901211

11911212
#if HAVE_LIBAVUTIL_HWCONTEXT_H
11921213
if (video_out_ctx->hw_frames_ctx and (static_cast<AVPixelFormat>(frame->format) != video_out_ctx->pix_fmt)) {
1193-
Debug(1, "Using hwframe");
1214+
zm_dump_frame(frame.get(), "using hwframe, src is");
11941215
int ret;
11951216
av_frame_ptr hw_frame = av_frame_ptr{zm_av_frame_alloc()};
11961217
if (!hw_frame) {
@@ -1208,12 +1229,13 @@ int VideoStore::writeVideoFramePacket(const std::shared_ptr<ZMPacket> zm_packet)
12081229
Error("Error while transferring frame data to surface: %s.", av_err2str(ret));
12091230
return ret;
12101231
}
1211-
ret = av_frame_copy_props(frame.get(), hw_frame.get());
1232+
ret = av_frame_copy_props( hw_frame.get(), frame.get());
12121233
if (ret < 0) {
12131234
Error("Unable to copy props: %s, continuing", av_make_error_string(ret).c_str());
12141235
}
12151236

12161237
frame = std::move(hw_frame);
1238+
zm_dump_frame(frame.get(), "using hwframe, dst is");
12171239
} // end if hwaccel
12181240
#endif
12191241
if (!frame) {
@@ -1244,6 +1266,17 @@ int VideoStore::writeVideoFramePacket(const std::shared_ptr<ZMPacket> zm_packet)
12441266
}
12451267
} else {
12461268
if (zm_packet->in_frame) {
1269+
Debug(2,
1270+
"pts for frame(%d) to packet pts (%" PRId64 ") from (zm_packet->in_frame(%" PRIi64 " - first %" PRId64 " ) @ %d/%d=>%d/%d",
1271+
frame_count,
1272+
zm_packet->packet->pts,
1273+
zm_packet->in_frame->pts,
1274+
video_first_pts,
1275+
video_in_stream->time_base.num,
1276+
video_in_stream->time_base.den,
1277+
video_out_ctx->time_base.num,
1278+
video_out_ctx->time_base.den);
1279+
12471280
if (video_first_pts == AV_NOPTS_VALUE) {
12481281
video_first_pts = zm_packet->in_frame->pts;
12491282
Debug(2, "No video_first_pts, set to (%" PRId64 ")", video_first_pts);
@@ -1305,7 +1338,7 @@ int VideoStore::writeVideoFramePacket(const std::shared_ptr<ZMPacket> zm_packet)
13051338
if (ret != AVERROR(EAGAIN)) {
13061339
Error("Could not receive packet (error %d = %s)", ret, av_make_error_string(ret).c_str());
13071340
} else {
1308-
Debug(1, "Could not receive packet (error %d = %s)", ret, av_make_error_string(ret).c_str());
1341+
Debug(4, "Could not receive packet (error %d = %s)", ret, av_make_error_string(ret).c_str());
13091342
}
13101343
return ret;
13111344
}
@@ -1487,10 +1520,10 @@ int VideoStore::write_packet(AVPacket *pkt, AVStream *stream) {
14871520
if (pkt->dts > pkt->pts) pkt->pts = pkt->dts; // Do it here to avoid warning below
14881521
} else if (pkt->dts == last_dts[stream->index]) {
14891522
// Commonly seen
1490-
Debug(1, "non increasing dts, fixing. our dts %" PRId64 " stream %d last_dts %" PRId64 " stream %d. reorder_queue_size=%zu",
1491-
pkt->dts, stream->index, last_dts[stream->index], stream->index, reorder_queue_size);
1523+
Debug(1, "non increasing dts, fixing. our dts %" PRId64 " stream %d last_dts %" PRId64 " last duration %" PRId64 " stream %d. reorder_queue_size=%zu",
1524+
pkt->dts, stream->index, last_dts[stream->index], last_duration[stream->index], stream->index, reorder_queue_size);
14921525
// dts MUST monotonically increase, so add 1 which should be a small enough time difference to not matter.
1493-
pkt->dts = last_dts[stream->index]+last_duration[stream->index];
1526+
pkt->dts = last_dts[stream->index]+last_duration[stream->index]-1;
14941527
if (pkt->dts > pkt->pts) pkt->pts = pkt->dts; // Do it here to avoid warning below
14951528
}
14961529
}

web/includes/Filter.php

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,8 +1145,8 @@ public function simple_widget() {
11451145

11461146
$html .= '<span class="term-value-wrapper">';
11471147
$html .= htmlSelect("filter[Query][terms][$i][val]", $availableTags, $selected, $options).PHP_EOL;
1148-
$html .= '</span>';
11491148
$html .= $this->addButtonForFilterSelect("filter[Query][terms][$i][val]");
1149+
$html .= '</span>';
11501150
// $html .= '<span>'.htmlSelect("filter[Query][terms][$i][val]", array_combine($availableTags,$availableTags), $term['val'],
11511151
// $options).'</span>'.PHP_EOL;
11521152
// $html .= '<span>'.htmlSelect("filter[Query][terms][$i][val]", $availableTags, $term['val'], $options).'</span>'.PHP_EOL;
@@ -1191,26 +1191,26 @@ public function simple_widget() {
11911191
} else if ( $term['attr'] == 'ExistsInFileSystem' ) {
11921192
$html .= '<span class="term-value-wrapper">';
11931193
$html .= htmlSelect("filter[Query][terms][$i][val]", $booleanValues, $term['val'], ['class'=>'chosen chosen-auto-width']).PHP_EOL;
1194-
$html .= '</span>';
11951194
$html .= $this->addButtonForFilterSelect("filter[Query][terms][$i][val]");
1195+
$html .= '</span>';
11961196
} else if ( $term['attr'] == 'Group') {
11971197
$html .= '<span class="term-value-wrapper">';
11981198
$html .= htmlSelect("filter[Query][terms][$i][val]", Group::get_dropdown_options(), $term['val'],
11991199
['class'=>'term-value chosen chosen-auto-width',
12001200
'multiple'=>'multiple',
12011201
'data-placeholder'=>translate('All Groups')]).PHP_EOL;
1202-
$html .= '</span>';
12031202
$html .= $this->addButtonForFilterSelect("filter[Query][terms][$i][val]");
1203+
$html .= '</span>';
12041204
} else if ( $term['attr'] == 'StateId' ) {
12051205
$html .= '<span class="term-value-wrapper">';
12061206
$html .= htmlSelect("filter[Query][terms][$i][val]", $states, $term['val'], ['class'=>'chosen chosen-auto-width']).PHP_EOL;
1207-
$html .= '</span>';
12081207
$html .= $this->addButtonForFilterSelect("filter[Query][terms][$i][val]");
1208+
$html .= '</span>';
12091209
} else if ( strpos($term['attr'], 'Weekday') !== false ) {
12101210
$html .= '<span class="term-value-wrapper">';
12111211
$html .= htmlSelect("filter[Query][terms][$i][val]", $weekdays, $term['val'], ['class'=>'chosen chosen-auto-width']).PHP_EOL;
1212-
$html .= '</span>';
12131212
$html .= $this->addButtonForFilterSelect("filter[Query][terms][$i][val]");
1213+
$html .= '</span>';
12141214
} else if ( $term['attr'] == 'Monitor' ) {
12151215
$monitors = [];
12161216
foreach (Monitor::find(['Deleted'=>false], ['order'=>'lower(Name)']) as $m) {
@@ -1232,8 +1232,8 @@ public function simple_widget() {
12321232
}
12331233
$html .= '<span class="term-value-wrapper">';
12341234
$html .= htmlSelect("filter[Query][terms][$i][val]", $monitors, $selected, $options).PHP_EOL;
1235-
$html .= '</span>';
12361235
$html .= $this->addButtonForFilterSelect("filter[Query][terms][$i][val]");
1236+
$html .= '</span>';
12371237
} else if ( $term['attr'] == 'MonitorName' ) {
12381238
$monitor_names = [];
12391239
foreach (Monitor::find(['Deleted'=>false], ['order'=>'lower(Name)']) as $m) {
@@ -1244,23 +1244,23 @@ public function simple_widget() {
12441244
$html .= '<span class="term-value-wrapper">';
12451245
$html .= htmlSelect("filter[Query][terms][$i][val]", array_combine($monitor_names,$monitor_names), $term['val'],
12461246
['class'=>'term-value chosen chosen-auto-width', 'multiple'=>'multiple', 'data-placeholder'=>translate('All Monitors')]).PHP_EOL;
1247-
$html .= '</span>';
12481247
$html .= $this->addButtonForFilterSelect("filter[Query][terms][$i][val]");
1248+
$html .= '</span>';
12491249
} else if ( $term['attr'] == 'ServerId' || $term['attr'] == 'MonitorServerId' || $term['attr'] == 'StorageServerId' || $term['attr'] == 'FilterServerId' ) {
12501250
$html .= '<span class="term-value-wrapper">';
12511251
$html .= htmlSelect("filter[Query][terms][$i][val]", $servers, $term['val'],
12521252
['class'=>'term-value chosen chosen-auto-width', 'multiple'=>'multiple']).PHP_EOL;
1253-
$html .= '</span>';
12541253
$html .= $this->addButtonForFilterSelect("filter[Query][terms][$i][val]");
1254+
$html .= '</span>';
12551255
} else if ( ($term['attr'] == 'StorageId') || ($term['attr'] == 'SecondaryStorageId') ) {
12561256
if (!$storageareas) {
12571257
$storageareas = array('' => array('Name'=>'NULL Unspecified'), '0' => array('Name'=>'Zero')) + ZM_Object::Objects_Indexed_By_Id('ZM\Storage');
12581258
}
12591259
$html .= '<span class="term-value-wrapper">';
12601260
$html .= htmlSelect("filter[Query][terms][$i][val]", $storageareas, $term['val'],
12611261
['class'=>'term-value chosen chosen-auto-width', 'multiple'=>'multiple']).PHP_EOL;
1262-
$html .= '</span>';
12631262
$html .= $this->addButtonForFilterSelect("filter[Query][terms][$i][val]");
1263+
$html .= '</span>';
12641264
} else if ( $term['attr'] == 'AlarmedZoneId' ) {
12651265
$html .= '<span class="term-value-wrapper">';
12661266
$html .= htmlSelect("filter[Query][terms][$i][val]", $zones, $term['val'],
@@ -1293,8 +1293,8 @@ public function simple_widget() {
12931293
'vehicle' => 'Vehicle'];
12941294
$html .= '<span class="term-value-wrapper">';
12951295
$html .= htmlSelect("filter[Query][terms][$i][val]", $options, $selected, $attrs).PHP_EOL;
1296-
$html .= '</span>';
12971296
$html .= $this->addButtonForFilterSelect("filter[Query][terms][$i][val]");
1297+
$html .= '</span>';
12981298
} else {
12991299
#$html .= $term['attr'];
13001300
$html .= '<span class="term-value-wrapper">';

web/skins/classic/css/base/skin.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,9 @@ input[type=submit],
640640
text-align: center;
641641
margin-right: 3px;
642642
}
643+
.btn-term-remove-all button {
644+
padding: 4px 10px;
645+
}
643646

644647
.btn-normal,
645648
.btn-normal:link {

web/skins/classic/css/base/views/event.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ height: 100%;
105105

106106
#eventStatsTable {
107107
}
108+
#eventStatsTable .label {
109+
min-width: 80px;
110+
}
108111
#eventVideo {
109112
/* width: 100%; *//* flex will make it fill the available space */
110113
}

web/skins/classic/css/base/views/events.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ body.sticky #eventTable thead {
7575
}
7676

7777
.term-value, .chosen-container{
78+
/*
7879
width: 100% !important;
80+
*/
7981
}
8082

8183
.bs-bars {

web/skins/classic/css/base/views/watch.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,3 +221,4 @@ button.btn.btn-view-watch, button.btn.btn-fullscreen, .ratioControl {
221221
margin-left: -1.0rem;
222222
}
223223
/* --- Support for old ZoomPan algorithm */
224+

0 commit comments

Comments
 (0)