New upstream version 22.0.3+dfsg1
This commit is contained in:
parent
665f64a933
commit
cdc9a9fc87
334 changed files with 14525 additions and 2639 deletions
2
plugins/coreaudio-encoder/data/locale/gd-GB.ini
Normal file
2
plugins/coreaudio-encoder/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
Bitrate="Reat bhiotaichean"
|
||||
|
||||
|
|
@ -12,4 +12,9 @@ ColorRange.Full="Πλήρης"
|
|||
ChannelFormat="Κανάλι"
|
||||
ChannelFormat.None="Κανένα"
|
||||
ChannelFormat.2_0ch="2 Καναλιών"
|
||||
ChannelFormat.2_1ch="2.1ch"
|
||||
ChannelFormat.4_0ch="4ch"
|
||||
ChannelFormat.4_1ch="4.1ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
||||
|
|
|
|||
12
plugins/decklink/data/locale/gd-GB.ini
Normal file
12
plugins/decklink/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
Device="Uidheam"
|
||||
Mode="Modh"
|
||||
Buffering="Cleachd bufaireadh"
|
||||
ColorSpace="Spàs dhathan YUV"
|
||||
ColorSpace.Default="Bun-roghainn"
|
||||
ColorRange="Rainse dhathan YUV"
|
||||
ColorRange.Default="Bun-roghainn"
|
||||
ColorRange.Partial="Leth-phàirteach"
|
||||
ColorRange.Full="Làn"
|
||||
ChannelFormat="Seanail"
|
||||
ChannelFormat.None="Chan eil gin"
|
||||
|
||||
|
|
@ -6,4 +6,9 @@ ColorRange.Full="Đầy đủ"
|
|||
ChannelFormat="Kênh"
|
||||
ChannelFormat.None="Không có"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.2_1ch="2.1ch"
|
||||
ChannelFormat.4_0ch="4ch"
|
||||
ChannelFormat.4_1ch="4.1ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Αρχεία εικόνων"
|
|||
SlideShow.CustomSize="Μέγεθος Οριοθέτησης/Αναλογία"
|
||||
SlideShow.CustomSize.Auto="Αυτόματο"
|
||||
SlideShow.Randomize="Τυχαιοποίηση αναπαραγωγής"
|
||||
SlideShow.Loop="Επανάληψη"
|
||||
SlideShow.Transition="Μετάβαση"
|
||||
SlideShow.Transition.Cut="Αποκοπή"
|
||||
SlideShow.Transition.Fade="Ξεθώριασμα"
|
||||
SlideShow.Transition.Swipe="Σύρσιμο"
|
||||
SlideShow.Transition.Slide="Ολίσθηση"
|
||||
SlideShow.PlaybackBehavior="Συμπεριφορά Ορατότητας"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Διακοπή όταν δεν είναι ορατή, επανεκκίνηση όταν είναι ορατή"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Παύση όταν δεν είναι ορατή, συνέχεια όταν είναι ορατή"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Αναπαραγωγή πάντα, ακόμα και αν δεν είναι ορατή"
|
||||
SlideShow.SlideMode="Λειτουργία παρουσίασης διαφανειών"
|
||||
SlideShow.SlideMode.Auto="Αυτόματα"
|
||||
SlideShow.SlideMode.Manual="Χειροκίνητα (χρήση συντομέυσεων για τον έλεγχο slideshow)"
|
||||
SlideShow.PlayPause="Αναπαραγωγή/Παύση"
|
||||
SlideShow.Restart="Επανεκκίνηση"
|
||||
SlideShow.Stop="Διακοπή"
|
||||
SlideShow.NextSlide="Επόμενη διαφάνεια"
|
||||
SlideShow.PreviousSlide="Προηγούμενη διαφάνεια"
|
||||
SlideShow.HideWhenDone="Απόκρυψη όταν η παρουσίαση τελειώσει"
|
||||
|
||||
ColorSource="Πηγή χρώματος"
|
||||
ColorSource.Color="Χρώμα"
|
||||
|
|
|
|||
|
|
@ -6,12 +6,17 @@ SlideShow="Piltide slaidiesitus"
|
|||
SlideShow.TransitionSpeed="Ülemineku kiirus (millisekundites)"
|
||||
SlideShow.SlideTime="Aeg slaidide vahel (millisekundites)"
|
||||
SlideShow.Files="Pildifailid"
|
||||
SlideShow.CustomSize.Auto="Automaatne"
|
||||
SlideShow.Randomize="Juhuslik taasesitus"
|
||||
SlideShow.Loop="Korda"
|
||||
SlideShow.Transition="Üleminek"
|
||||
SlideShow.Transition.Cut="Ilmuv"
|
||||
SlideShow.Transition.Fade="Hajuv"
|
||||
SlideShow.Transition.Swipe="Pühkiv"
|
||||
SlideShow.Transition.Slide="Sisselendav"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Mängi alati, isegi siis kui pole nähtav"
|
||||
SlideShow.SlideMode.Auto="Automaatne"
|
||||
SlideShow.PlayPause="Esita/Peata"
|
||||
|
||||
ColorSource="Värvi allikas"
|
||||
ColorSource.Color="Värv"
|
||||
|
|
|
|||
25
plugins/image-source/data/locale/gd-GB.ini
Normal file
25
plugins/image-source/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
ImageInput="Dealbh"
|
||||
File="Faidhle deilbh"
|
||||
UnloadWhenNotShowing="Dì-luchdaich an dealbh mur eil e ’ga shealltainn"
|
||||
|
||||
SlideShow="Taisbeanadh shleamhnagan dhealbhan"
|
||||
SlideShow.TransitionSpeed="Luaths an tar-mhùthaidh (mille-dhiog)"
|
||||
SlideShow.SlideTime="An ùine eadar na sleamhnagan (mille-dhiog)"
|
||||
SlideShow.Files="Faidhlichean deilbh"
|
||||
SlideShow.CustomSize="Meud an iadhaidh/Co-mheas deilbh"
|
||||
SlideShow.CustomSize.Auto="Fèin-obrachail"
|
||||
SlideShow.Loop="Lùb"
|
||||
SlideShow.Transition="Tar-mhùthadh"
|
||||
SlideShow.Transition.Cut="Gearr às"
|
||||
SlideShow.Transition.Fade="Crìon"
|
||||
SlideShow.Transition.Swipe="Grad-shlaighd"
|
||||
SlideShow.Transition.Slide="Sleamhnaich"
|
||||
SlideShow.SlideMode.Auto="Fèin-obrachail"
|
||||
SlideShow.PlayPause="Cluich/Cuir ’na stad"
|
||||
SlideShow.Restart="Ath-thòisich"
|
||||
SlideShow.Stop="Cuir stad air"
|
||||
|
||||
ColorSource.Color="Dath"
|
||||
ColorSource.Width="Leud"
|
||||
ColorSource.Height="Àirde"
|
||||
|
||||
2
plugins/linux-alsa/data/locale/gd-GB.ini
Normal file
2
plugins/linux-alsa/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
Device="Uidheam"
|
||||
|
||||
16
plugins/linux-capture/data/locale/gd-GB.ini
Normal file
16
plugins/linux-capture/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
X11SharedMemoryScreenInput="Glacadh-sgrìn (XSHM)"
|
||||
Screen="Sgrìn"
|
||||
CaptureCursor="Glac an cùrsair"
|
||||
AdvancedSettings="Roghainnean adhartach"
|
||||
XServer="Frithealaiche X"
|
||||
XCCapture="Glacadh uinneige (Xcomposite)"
|
||||
Window="Uinneag"
|
||||
CropTop="Bearr aig a’ bharr (piogsail)"
|
||||
CropLeft="Bearr aig an taobh chlì (piogsail)"
|
||||
CropRight="Bearr aig an taobh deas (piogsail)"
|
||||
CropBottom="Bearr aig a’ bhonn (piogsail)"
|
||||
SwapRedBlue="Suaip dearg is gorm"
|
||||
LockX="Glais am frithealaiche X rè a’ ghlacaidh"
|
||||
IncludeXBorder="Gabh a-steach an t-iomall X"
|
||||
ExcludeAlpha="Cleachd fòrmat innich gun alpha (seachnadh buga Mesa)"
|
||||
|
||||
4
plugins/linux-pulseaudio/data/locale/gd-GB.ini
Normal file
4
plugins/linux-pulseaudio/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
PulseInput="Glacadh ion-chur fuaime (PulseAudio)"
|
||||
PulseOutput="Glacadh às-chur fuaime (PulseAudio)"
|
||||
Device="Uidheam"
|
||||
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
PulseInput="Dispositivo de Entrada de Áudio (PulseAudio)"
|
||||
PulseOutput="Dispotitivo de Saída de Áudio (PulseAudio)"
|
||||
Device="Dispotivo"
|
||||
PulseOutput="Dispositivo de Saída de Áudio (PulseAudio)"
|
||||
Device="Dispositivo"
|
||||
|
||||
|
|
|
|||
11
plugins/linux-v4l2/data/locale/gd-GB.ini
Normal file
11
plugins/linux-v4l2/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
V4L2Input="Uidheam glacadh video (V4L2)"
|
||||
Device="Uidheam"
|
||||
Input="Ion-chur"
|
||||
VideoFormat="Fòrmat a’ video"
|
||||
VideoStandard="Stannard a’ video"
|
||||
DVTiming="Co-thìmeachadh DV"
|
||||
Resolution="Dùmhlachd-bhreacaidh"
|
||||
FrameRate="Reat fhrèamaichean"
|
||||
LeaveUnchanged="Cum gun atharrachadh"
|
||||
UseBuffering="Cleachd bufaireadh"
|
||||
|
||||
14
plugins/mac-avcapture/data/locale/gd-GB.ini
Normal file
14
plugins/mac-avcapture/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
AVCapture="Uidheam glacadh video"
|
||||
Device="Uidheam"
|
||||
UsePreset="Cleachd ro-sheata"
|
||||
Preset="Ro-sheata"
|
||||
Buffering="Cleachd bufaireadh"
|
||||
FrameRate="Reat fhrèamaichean"
|
||||
InputFormat="Fòrmat an ion-chuir"
|
||||
ColorSpace="Spàs dhathan"
|
||||
VideoRange="Rainse a’ video"
|
||||
VideoRange.Partial="Leth-phàirteach"
|
||||
VideoRange.Full="Làn"
|
||||
Auto="Fèin-obrachail"
|
||||
Unknown="Chan eil fhios ($1)"
|
||||
|
||||
14
plugins/mac-avcapture/data/locale/ka-GE.ini
Normal file
14
plugins/mac-avcapture/data/locale/ka-GE.ini
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
AVCapture="ვიდეოს ჩამწერი მოწყობილობა"
|
||||
Device="მოწყობილობა"
|
||||
UsePreset="მზა პარამეტრებით სარგებლობა"
|
||||
Preset="მზა პარამეტრები"
|
||||
Buffering="ბუფერიზაციის გამოყენება"
|
||||
FrameRate="კადრის სიხშირე"
|
||||
InputFormat="შეტანის ფორმატი"
|
||||
ColorSpace="ფერთა სისტემა"
|
||||
VideoRange="ვიდეოების არე"
|
||||
VideoRange.Partial="ნაწილობრივი"
|
||||
VideoRange.Full="სრული"
|
||||
Auto="ავტომატური"
|
||||
Unknown="უცნობი ($1)"
|
||||
|
||||
21
plugins/mac-capture/data/locale/gd-GB.ini
Normal file
21
plugins/mac-capture/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
CoreAudio.InputCapture="Glacadh ion-chur fuaime"
|
||||
CoreAudio.OutputCapture="Glacadh às-chur fuaime"
|
||||
CoreAudio.Device="Uidheam"
|
||||
CoreAudio.Device.Default="Bun-roghainn"
|
||||
DisplayCapture="Glacadh uidheim-taisbeanaidh"
|
||||
DisplayCapture.Display="Uidheam-taisbeanaidh"
|
||||
DisplayCapture.ShowCursor="Seall an cùrsair"
|
||||
WindowCapture="Glacadh uinneige"
|
||||
WindowCapture.ShowShadow="Seall sgàil na h-uinneige"
|
||||
WindowUtils.Window="Uinneag"
|
||||
WindowUtils.ShowEmptyNames="Seall na h-uinneagan le ainmean falamh"
|
||||
CropMode="Bearr"
|
||||
CropMode.None="Chan eil gin"
|
||||
CropMode.Manual="A làimh"
|
||||
CropMode.ToWindow="Dhan uinneag"
|
||||
CropMode.ToWindowAndManual="Dhan uinneag is a làimh"
|
||||
Crop.origin.x="Bearr aig an taobh chlì"
|
||||
Crop.origin.y="Bearr aig a’ bharr"
|
||||
Crop.size.width="Bearr aig an taobh deas"
|
||||
Crop.size.height="Bearr aig a’ bhonn"
|
||||
|
||||
21
plugins/mac-capture/data/locale/ka-GE.ini
Normal file
21
plugins/mac-capture/data/locale/ka-GE.ini
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
CoreAudio.InputCapture="შემავალი ხმოვანი სიგნალის ჩაწერა"
|
||||
CoreAudio.OutputCapture="გამომავალი ხმოვანი სიგნალის ჩაწერა"
|
||||
CoreAudio.Device="მოწყობილობა"
|
||||
CoreAudio.Device.Default="ნაგულისხმევი"
|
||||
DisplayCapture="ეკრანის გადაღება"
|
||||
DisplayCapture.Display="ეკრანი"
|
||||
DisplayCapture.ShowCursor="მაჩვენებლის გამოჩენა"
|
||||
WindowCapture="ფანჯრის გადაღება"
|
||||
WindowCapture.ShowShadow="ფანჯრის ჩრდილის ჩვენება"
|
||||
WindowUtils.Window="ფანჯარა"
|
||||
WindowUtils.ShowEmptyNames="ფანჯრის ჩვენება ცარიელი სახელებით"
|
||||
CropMode="შემოჭრა"
|
||||
CropMode.None="არცერთი"
|
||||
CropMode.Manual="ხელით"
|
||||
CropMode.ToWindow="ფანჯარაზე"
|
||||
CropMode.ToWindowAndManual="ფანჯარაზე ხელით"
|
||||
Crop.origin.x="მარცხნივ შემოჭრა"
|
||||
Crop.origin.y="ზემოთ შემოჭრა"
|
||||
Crop.size.width="მარჯვნივ შემოჭრა"
|
||||
Crop.size.height="ქვემოთ შემოჭრა"
|
||||
|
||||
9
plugins/mac-syphon/data/locale/gd-GB.ini
Normal file
9
plugins/mac-syphon/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
Source="Tùs"
|
||||
Application="Aplacaid"
|
||||
Crop="Bearr"
|
||||
Crop.origin.x="Bearr aig an taobh chlì"
|
||||
Crop.origin.y="Bearr aig a’ bharr"
|
||||
Crop.size.width="Bearr aig an taobh deas"
|
||||
Crop.size.height="Bearr aig a’ bhonn"
|
||||
AllowTransparency="Ceadaich trìd-shoillearachd"
|
||||
|
||||
13
plugins/mac-syphon/data/locale/ka-GE.ini
Normal file
13
plugins/mac-syphon/data/locale/ka-GE.ini
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
Syphon="თამაშის გადაღება (Syphon)"
|
||||
Source="წყარო"
|
||||
LaunchSyphonInject="SyphonInject გაშვება"
|
||||
Inject="ჩადგმა"
|
||||
Application="პროგრამა"
|
||||
SyphonLicense="Syphon ლიცენზია"
|
||||
Crop="შემოჭრა"
|
||||
Crop.origin.x="მარცხნივ შემოჭრა"
|
||||
Crop.origin.y="ზემოთ შემოჭრა"
|
||||
Crop.size.width="მარჯვნივ შემოჭრა"
|
||||
Crop.size.height="ქვემოთ შემოჭრა"
|
||||
AllowTransparency="გამჭვირვალობის დაშვება"
|
||||
|
||||
|
|
@ -4,7 +4,7 @@ VTEncoder="VideoToolbox Codierer"
|
|||
Bitrate="Bitrate"
|
||||
UseMaxBitrate="Limitiere Bitrate"
|
||||
MaxBitrate="Maximale Bitrate"
|
||||
MaxBitrateWindow="Maximale Bitrate Fenster (Sekunden)"
|
||||
MaxBitrateWindow="Maximales Bitrate Fenster (Sekunden)"
|
||||
KeyframeIntervalSec="Keyframeintervall (Sekunden, 0=auto)"
|
||||
Profile="Profil"
|
||||
None="(Nichts)"
|
||||
|
|
|
|||
6
plugins/mac-vth264/data/locale/gd-GB.ini
Normal file
6
plugins/mac-vth264/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
Bitrate="Reat bhiotaichean"
|
||||
KeyframeIntervalSec="Eadaramh nam frèamaichean-iuchrach (diog, fèin-obrachail)"
|
||||
Profile="Pròifil"
|
||||
None="(Chan eil gin)"
|
||||
|
||||
|
||||
14
plugins/mac-vth264/data/locale/ka-GE.ini
Normal file
14
plugins/mac-vth264/data/locale/ka-GE.ini
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
VTH264EncHW="Apple VT H264 აპარატურული დამშიფრავი"
|
||||
VTH264EncSW="Apple VT H264 პროგრამული დამშიფრავი"
|
||||
VTEncoder="VideoToolbox დამშიფრავი"
|
||||
Bitrate="ბიტური სიხშირე"
|
||||
UseMaxBitrate="ბიტური სიხშირის შეზღუდვა"
|
||||
MaxBitrate="უმაღლესი დაშვებული ბიტური სიხშირის"
|
||||
MaxBitrateWindow="უმაღლესი ბიტური სიხშირის ფანჯარა (წამები)"
|
||||
KeyframeIntervalSec="საკვანძო კადრებს შორის შუალედი (წამი, 0=თვითშერჩევა)"
|
||||
Profile="პროფილი"
|
||||
None="(არცერთი)"
|
||||
DefaultEncoder="(ნაგულისხმევი დამშიფრავი)"
|
||||
UseBFrames="B-კადრების გამოყენება"
|
||||
|
||||
|
||||
|
|
@ -424,11 +424,12 @@ static void vt_h264_video_info(void *data, struct video_scale_info *info)
|
|||
enc->vt_pix_fmt = enc->fullrange ?
|
||||
kCVPixelFormatType_420YpCbCr8PlanarFullRange
|
||||
: kCVPixelFormatType_420YpCbCr8Planar;
|
||||
} else if (info->format == VIDEO_FORMAT_I444) {
|
||||
enc->obs_pix_fmt = info->format;
|
||||
enc->vt_pix_fmt = kCVPixelFormatType_444YpCbCr10;
|
||||
return;
|
||||
}
|
||||
|
||||
if (info->format == VIDEO_FORMAT_I444)
|
||||
VT_BLOG(LOG_WARNING, "I444 color format not supported");
|
||||
|
||||
// Anything else, return default
|
||||
enc->obs_pix_fmt = VIDEO_FORMAT_NV12;
|
||||
enc->vt_pix_fmt = enc->fullrange ?
|
||||
|
|
@ -445,11 +446,12 @@ static void update_params(struct vt_h264_encoder *enc, obs_data_t *settings)
|
|||
|
||||
struct video_scale_info info = { .format = voi->format };
|
||||
|
||||
enc->fullrange = voi->range == VIDEO_RANGE_FULL;
|
||||
|
||||
// also sets the enc->vt_pix_fmt
|
||||
vt_h264_video_info(enc, &info);
|
||||
|
||||
enc->colorspace = voi->colorspace;
|
||||
enc->fullrange = voi->range == VIDEO_RANGE_FULL;
|
||||
|
||||
enc->width = obs_encoder_get_width(enc->encoder);
|
||||
enc->height = obs_encoder_get_height(enc->encoder);
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ ColorRange.Auto="Automatický"
|
|||
ColorRange.Partial="Částečný"
|
||||
ColorRange.Full="Celkový"
|
||||
RestartMedia="Restartovat mediální zdroj"
|
||||
SpeedPercentage="Rychlost (procenta)"
|
||||
Seekable="Posouvatelné"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Všechny mediální soubory"
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ ColorRange.Auto="Auto"
|
|||
ColorRange.Partial="Delvis"
|
||||
ColorRange.Full="Fuld"
|
||||
RestartMedia="Genstart Media"
|
||||
SpeedPercentage="Hastighed (procent)"
|
||||
Seekable="Seekable"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Alle mediefiler"
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
FFmpegOutput="Έξοδος FFmpeg"
|
||||
FFmpegAAC="FFmpeg προεπιλεγμένος κωδικοποιητής AAC"
|
||||
FFmpegOpus="FFmpeg Opus κωδικοποιητής"
|
||||
Bitrate="Ρυθμός μετάδοσης bit"
|
||||
Preset="Προκαθορισμένο στυλ"
|
||||
RateControl="Έλεγχος ρυθμού"
|
||||
|
|
@ -35,6 +36,8 @@ ColorRange.Auto="Αυτόματο"
|
|||
ColorRange.Partial="Μερικός"
|
||||
ColorRange.Full="Πλήρης"
|
||||
RestartMedia="Επανεκκίνηση Πολυμέσων"
|
||||
SpeedPercentage="Ταχύτητα (τοις εκατό)"
|
||||
Seekable="Παρεχόμενη"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Όλα τα αρχεία πολυμέσων"
|
||||
MediaFileFilter.VideoFiles="Αρχεία Βίντεο"
|
||||
|
|
@ -44,4 +47,6 @@ MediaFileFilter.AllFiles="Όλα τα αρχεία"
|
|||
ReplayBuffer="Διάρκεια μνήμης Replay"
|
||||
ReplayBuffer.Save="Αποθήκευση Replay"
|
||||
|
||||
HelperProcessFailed="Αδυναμία έναρξης τού βοηθού της διαδικασίας εγγραφής. Ελέγξτε ότι τα αρχεία OBS δεν έχουν αποκλειστεί η καταργηθεί από ένα τρίτο antivirus / λογισμικό ασφαλείας."
|
||||
UnableToWritePath="Αδυναμία εγγραφής %1. Βεβαιωθείτε ότι χρησιμοποιείτε μια διαδρομή εγγραφής που επιτρέπεται για εγγραφή τού λογαριασμού χρήστη και ότι υπάρχει επαρκής χώρος στον σκληρό δίσκο."
|
||||
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ ColorRange.Auto="Automatico"
|
|||
ColorRange.Partial="Parcial"
|
||||
ColorRange.Full="Completo"
|
||||
RestartMedia="Reiniciar Medio"
|
||||
SpeedPercentage="Velocidad (porcentaje)"
|
||||
Seekable="Buscable"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Todos los archivos multimedia"
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ ColorRange.Auto="Auto"
|
|||
ColorRange.Partial="Partziala"
|
||||
ColorRange.Full="Osoa"
|
||||
RestartMedia="Berrabiarazi euskarria"
|
||||
SpeedPercentage="Abiadura (ehunekoa)"
|
||||
Seekable="Bilagai"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Multimedia-fitxategi guztiak"
|
||||
|
|
|
|||
49
plugins/obs-ffmpeg/data/locale/gd-GB.ini
Normal file
49
plugins/obs-ffmpeg/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
FFmpegOutput="Às-chur FFmpeg"
|
||||
FFmpegAAC="Inneal-còdachaidh AAC tùsail airson FFmpeg"
|
||||
FFmpegOpus="Inneal-còdachaidh Opus airson FFmpeg"
|
||||
Bitrate="Reat bhiotaichean"
|
||||
Preset="Ro-sheata"
|
||||
RateControl="Smachd air an reat"
|
||||
KeyframeIntervalSec="Eadaramh nam frèamaichean-iuchrach (diog, fèin-obrachail)"
|
||||
Lossless="Gun chall càileachd"
|
||||
|
||||
BFrames="Frèamaichean-B"
|
||||
|
||||
NVENC.Use2Pass="Cleachd còdachadh dà phas"
|
||||
NVENC.Preset.default="Bun-roghainn"
|
||||
NVENC.Preset.hq="Càileachd àrd"
|
||||
NVENC.Preset.hp="Dèanadas àrd"
|
||||
NVENC.Preset.bd="Bluray"
|
||||
NVENC.Preset.ll="Foillidheachd ìosal"
|
||||
NVENC.Preset.llhq="Foillidheachd ìosal ⁊ càileachd àrd"
|
||||
NVENC.Preset.llhp="Foillidheachd ìosal ⁊ dèanadas àrd"
|
||||
NVENC.Level="Leibheil"
|
||||
|
||||
FFmpegSource="Tùs a’ mheadhain"
|
||||
LocalFile="Faidhle ionadail"
|
||||
Looping="Lùb"
|
||||
Input="Ion-chur"
|
||||
InputFormat="Fòrmat an ion-chuir"
|
||||
BufferingMB="Bufair an lìonraidh (MB)"
|
||||
HardwareDecode="Cleachd dì-chòdachadh bathair-chruaidh ma bhios e ri fhaighinn"
|
||||
ClearOnMediaEnd="Falaich an tùs nuair a bhios a’ chluiche deiseil"
|
||||
Advanced="Adhartach"
|
||||
RestartWhenActivated="Ath-thòisich a’ chluiche nuair a thig gnìomh on tùs"
|
||||
CloseFileWhenInactive="Dùin am faidhle mur eil gnìomh ann"
|
||||
ColorRange="Rainse dhathan YUV"
|
||||
ColorRange.Auto="Fèin-obrachail"
|
||||
ColorRange.Partial="Leth-phàirteach"
|
||||
ColorRange.Full="Làn"
|
||||
RestartMedia="Ath-thòisich am meadhan"
|
||||
SpeedPercentage="Luaths (sa cheud)"
|
||||
Seekable="Gabhaidh sireadh ann"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="A h-uile faidhle meadhain"
|
||||
MediaFileFilter.VideoFiles="Faidhlichean video"
|
||||
MediaFileFilter.AudioFiles="Faidhlichean fuaime"
|
||||
MediaFileFilter.AllFiles="A h-uile faidhle"
|
||||
|
||||
ReplayBuffer="Bufair na h-ath-chluiche"
|
||||
ReplayBuffer.Save="Sàbhail an ath-chluiche"
|
||||
|
||||
|
||||
|
|
@ -36,6 +36,7 @@ ColorRange.Auto="Autom."
|
|||
ColorRange.Partial="Parziale"
|
||||
ColorRange.Full="Intero"
|
||||
RestartMedia="Riavvia Media"
|
||||
SpeedPercentage="Velocità (percentuale)"
|
||||
Seekable="Ricercabile"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Tutti i file media"
|
||||
|
|
|
|||
52
plugins/obs-ffmpeg/data/locale/ka-GE.ini
Normal file
52
plugins/obs-ffmpeg/data/locale/ka-GE.ini
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
FFmpegOutput="FFmpeg გამომავალი სიგნალი"
|
||||
FFmpegAAC="FFmpeg ნაგულისხმევი AAC დამშიფრავი"
|
||||
FFmpegOpus="FFmpeg Opus დამშიფრავი"
|
||||
Bitrate="ბიტური სიხშირე"
|
||||
Preset="მზა პარამეტრები"
|
||||
RateControl="სიხშირის მართვა"
|
||||
KeyframeIntervalSec="საკვანძო კადრებს შორის შუალედი (წამი, 0=თვითშერჩევა)"
|
||||
Lossless="უდანაკარგო"
|
||||
|
||||
BFrames="B-კადრები"
|
||||
|
||||
NVENC.Use2Pass="ორმაგი დაშიფვრის გამოყენება"
|
||||
NVENC.Preset.default="ნაგულისხმევი"
|
||||
NVENC.Preset.hq="მაღალი ხარისხი"
|
||||
NVENC.Preset.hp="მაღალი წარმადობა"
|
||||
NVENC.Preset.bd="Bluray"
|
||||
NVENC.Preset.ll="მცირე დაყოვნება"
|
||||
NVENC.Preset.llhq="მცირე დაყოვნება, მაღალი ხარისხი"
|
||||
NVENC.Preset.llhp="მცირე დაყოვნება, მაღალი წარმადობა"
|
||||
NVENC.Level="საფეხური"
|
||||
|
||||
FFmpegSource="მასალის წყარო"
|
||||
LocalFile="ადგილობრივი ფაილი"
|
||||
Looping="დაუსრულებლად გამეორება"
|
||||
Input="შეტანა"
|
||||
InputFormat="შეტანის ფორმატი"
|
||||
BufferingMB="ქსელის ბუფერიზაცია (მბაიტი)"
|
||||
HardwareDecode="აპარატურული დაშიფვრის გამოყენება, ხელმისაწვდომობის შემთხვევაში"
|
||||
ClearOnMediaEnd="წყაროს დამალვა, გაშვების დამთავრებისას"
|
||||
Advanced="გაფართოებული"
|
||||
RestartWhenActivated="ხელახლა გაშვება წყაროს ამოქმედებისას"
|
||||
CloseFileWhenInactive="ფაილის დახურვა უმოქმედობისას"
|
||||
CloseFileWhenInactive.ToolTip="ფაილი დაიხურება, თუ წყარო არ იქნება ეთერში ან\nჩაწერაზე გაშვებული. ეს საშუალებას იძლევა შეიცვალოს ფაილი, როცა წყარო არაა მოქმედი,\nთუმცა ხელახლა ამოქმედებისას, შესაძლოა გარკვეული დროით დაყოვნებას ჰქონდეს ადგილი."
|
||||
ColorRange="YUV ფერთა გამა"
|
||||
ColorRange.Auto="ავტომატური"
|
||||
ColorRange.Partial="ნაწილობრივი"
|
||||
ColorRange.Full="სრული"
|
||||
RestartMedia="მასალის ხელახლა გაშვება"
|
||||
SpeedPercentage="სიჩქარე (პროცენტი)"
|
||||
Seekable="გადახვევით"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="ყველა მასალა"
|
||||
MediaFileFilter.VideoFiles="ვიდეოფაილები"
|
||||
MediaFileFilter.AudioFiles="ხმოვანი ფაილები"
|
||||
MediaFileFilter.AllFiles="ყველა ფაილი"
|
||||
|
||||
ReplayBuffer="გადახვევა"
|
||||
ReplayBuffer.Save="გადახვევის შენახვა"
|
||||
|
||||
HelperProcessFailed="ჩაწერის პროცესის გაშვება ვერ ხერხდება. გადაამოწმეთ, ხომ არ არის OBS ფაილები შეზღუდული ან წაშლილი ანტივირუსის / უსაფრთხოების სხვა პროგრამების მიერ."
|
||||
UnableToWritePath="%1-ში ჩაწერა ვერ ხერხდება. დარწმუნდით, რომ ჩაწერისთვის ისეთი მისამართი გაქვთ მითითებული, სადაც ჩაწერის ნებართვაც გააჩნია თქვენს ანგარიშს და ამასთან, არის საკმარისი ადგილი დისკზე."
|
||||
|
||||
|
|
@ -36,6 +36,7 @@ ColorRange.Auto="Automatisk"
|
|||
ColorRange.Partial="Delvis"
|
||||
ColorRange.Full="Hel"
|
||||
RestartMedia="Start media på nytt"
|
||||
SpeedPercentage="Fart (prosent)"
|
||||
Seekable="Søkbar"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Alle mediefiler"
|
||||
|
|
|
|||
|
|
@ -316,6 +316,7 @@ static void create_video_stream(struct ffmpeg_mux *ffm)
|
|||
(AVRational){ffm->params.fps_den, ffm->params.fps_num};
|
||||
|
||||
ffm->video_stream->time_base = context->time_base;
|
||||
ffm->video_stream->avg_frame_rate = av_inv_q(context->time_base);
|
||||
|
||||
if (ffm->output->oformat->flags & AVFMT_GLOBALHEADER)
|
||||
context->flags |= CODEC_FLAG_GLOBAL_H;
|
||||
|
|
|
|||
|
|
@ -132,6 +132,10 @@ static bool initialize_codec(struct enc_encoder *enc)
|
|||
warn("Failed to open AAC codec: %s", av_err2str(ret));
|
||||
return false;
|
||||
}
|
||||
enc->aframe->format = enc->context->sample_fmt;
|
||||
enc->aframe->channels = enc->context->channels;
|
||||
enc->aframe->channel_layout = enc->context->channel_layout;
|
||||
enc->aframe->sample_rate = enc->context->sample_rate;
|
||||
|
||||
enc->frame_size = enc->context->frame_size;
|
||||
if (!enc->frame_size)
|
||||
|
|
|
|||
|
|
@ -290,6 +290,11 @@ static bool open_audio_codec(struct ffmpeg_data *data)
|
|||
return false;
|
||||
}
|
||||
|
||||
data->aframe->format = context->sample_fmt;
|
||||
data->aframe->channels = context->channels;
|
||||
data->aframe->channel_layout = context->channel_layout;
|
||||
data->aframe->sample_rate = context->sample_rate;
|
||||
|
||||
context->strict_std_compliance = -2;
|
||||
|
||||
ret = avcodec_open2(context, data->acodec, NULL);
|
||||
|
|
|
|||
|
|
@ -351,16 +351,16 @@ static obs_properties_t *color_correction_filter_properties(void *data)
|
|||
obs_properties_t *props = obs_properties_create();
|
||||
|
||||
obs_properties_add_float_slider(props, SETTING_GAMMA,
|
||||
TEXT_GAMMA, -3.0f, 3.0f, 0.01f);
|
||||
TEXT_GAMMA, -3.0, 3.0, 0.01);
|
||||
|
||||
obs_properties_add_float_slider(props, SETTING_CONTRAST,
|
||||
TEXT_CONTRAST, -2.0f, 2.0f, 0.01f);
|
||||
TEXT_CONTRAST, -2.0, 2.0, 0.01);
|
||||
obs_properties_add_float_slider(props, SETTING_BRIGHTNESS,
|
||||
TEXT_BRIGHTNESS, -1.0f, 1.0f, 0.01f);
|
||||
TEXT_BRIGHTNESS, -1.0, 1.0, 0.01);
|
||||
obs_properties_add_float_slider(props, SETTING_SATURATION,
|
||||
TEXT_SATURATION, -1.0f, 5.0f, 0.01f);
|
||||
TEXT_SATURATION, -1.0, 5.0, 0.01);
|
||||
obs_properties_add_float_slider(props, SETTING_HUESHIFT,
|
||||
TEXT_HUESHIFT, -180.0f, 180.0f, 0.01f);
|
||||
TEXT_HUESHIFT, -180.0, 180.0, 0.01);
|
||||
obs_properties_add_int_slider(props, SETTING_OPACITY,
|
||||
TEXT_OPACITY, 0, 100, 1);
|
||||
|
||||
|
|
|
|||
|
|
@ -40,12 +40,12 @@
|
|||
#define TEXT_OUTPUT_GAIN MT_("Compressor.OutputGain")
|
||||
#define TEXT_SIDECHAIN_SOURCE MT_("Compressor.SidechainSource")
|
||||
|
||||
#define MIN_RATIO 1.0f
|
||||
#define MAX_RATIO 32.0f
|
||||
#define MIN_THRESHOLD_DB -60.0f
|
||||
#define MIN_RATIO 1.0
|
||||
#define MAX_RATIO 32.0
|
||||
#define MIN_THRESHOLD_DB -60.0
|
||||
#define MAX_THRESHOLD_DB 0.0f
|
||||
#define MIN_OUTPUT_GAIN_DB -32.0f
|
||||
#define MAX_OUTPUT_GAIN_DB 32.0f
|
||||
#define MIN_OUTPUT_GAIN_DB -32.0
|
||||
#define MAX_OUTPUT_GAIN_DB 32.0
|
||||
#define MIN_ATK_RLS_MS 1
|
||||
#define MAX_RLS_MS 1000
|
||||
#define MAX_ATK_MS 500
|
||||
|
|
@ -442,6 +442,9 @@ static struct obs_audio_data *compressor_filter_audio(void *data,
|
|||
struct compressor_data *cd = data;
|
||||
|
||||
const uint32_t num_samples = audio->frames;
|
||||
if (num_samples == 0)
|
||||
return audio;
|
||||
|
||||
float **samples = (float**)audio->data;
|
||||
|
||||
pthread_mutex_lock(&cd->sidechain_update_mutex);
|
||||
|
|
@ -497,15 +500,15 @@ static obs_properties_t *compressor_properties(void *data)
|
|||
parent = obs_filter_get_parent(cd->context);
|
||||
|
||||
obs_properties_add_float_slider(props, S_RATIO,
|
||||
TEXT_RATIO, MIN_RATIO, MAX_RATIO, 0.5f);
|
||||
TEXT_RATIO, MIN_RATIO, MAX_RATIO, 0.5);
|
||||
obs_properties_add_float_slider(props, S_THRESHOLD,
|
||||
TEXT_THRESHOLD, MIN_THRESHOLD_DB, MAX_THRESHOLD_DB, 0.1f);
|
||||
TEXT_THRESHOLD, MIN_THRESHOLD_DB, MAX_THRESHOLD_DB, 0.1);
|
||||
obs_properties_add_int_slider(props, S_ATTACK_TIME,
|
||||
TEXT_ATTACK_TIME, MIN_ATK_RLS_MS, MAX_ATK_MS, 1);
|
||||
obs_properties_add_int_slider(props, S_RELEASE_TIME,
|
||||
TEXT_RELEASE_TIME, MIN_ATK_RLS_MS, MAX_RLS_MS, 1);
|
||||
obs_properties_add_float_slider(props, S_OUTPUT_GAIN,
|
||||
TEXT_OUTPUT_GAIN, MIN_OUTPUT_GAIN_DB, MAX_OUTPUT_GAIN_DB, 0.1f);
|
||||
TEXT_OUTPUT_GAIN, MIN_OUTPUT_GAIN_DB, MAX_OUTPUT_GAIN_DB, 0.1);
|
||||
|
||||
obs_property_t *sources = obs_properties_add_list(props,
|
||||
S_SIDECHAIN_SOURCE, TEXT_SIDECHAIN_SOURCE,
|
||||
|
|
|
|||
|
|
@ -1,15 +1,25 @@
|
|||
ColorFilter="Διόρθωση Χρώματος"
|
||||
ColorGradeFilter="Εφαρμογή LUT"
|
||||
MaskFilter="Μάσκα εικόνα/μείγμα"
|
||||
AsyncDelayFilter="Καθυστέρηση Βίντεο (Ασύγχρονη)"
|
||||
CropFilter="Αποκοπή/Pad"
|
||||
ScrollFilter="Κύλιση"
|
||||
ChromaKeyFilter="Κλειδί Chroma"
|
||||
ColorKeyFilter="Κλειδί Χρώματος"
|
||||
SharpnessFilter="Όξυνση"
|
||||
ScaleFilter="Κλιμάκωση/αναλογίες"
|
||||
GPUDelayFilter="Καταστήσει καθυστέρηση"
|
||||
UndistortCenter="Undistort κέντρο της εικόνας κατά την κλιμάκωση από ultrawide"
|
||||
NoiseGate="Πύλη θορύβου"
|
||||
NoiseSuppress="Καταστολή θορύβου"
|
||||
Gain="Απολαβή"
|
||||
DelayMs="Καθυστέρηση (χιλιοστά του δευτερολέπτου)"
|
||||
Type="Τύπος"
|
||||
MaskBlendType.MaskColor="Μάσκα Άλφα (Κανάλι Χρώματος)"
|
||||
MaskBlendType.MaskAlpha="Μάσκα Άλφα (Κανάλι Άλφα)"
|
||||
MaskBlendType.BlendMultiply="Ανάμιξη (πολλαπλασιάζονται)"
|
||||
MaskBlendType.BlendAddition="Μείγμα (Προσθήκη)"
|
||||
MaskBlendType.BlendSubtraction="Μείγμα (αφαίρεση)"
|
||||
Path="Διαδρομή"
|
||||
Color="Χρώμα"
|
||||
Opacity="Αδιαφάνεια"
|
||||
|
|
@ -18,8 +28,11 @@ Brightness="Φωτεινότητα"
|
|||
Gamma="Γάμμα"
|
||||
BrowsePath.Images="Όλα τα αρχεία εικόνας"
|
||||
BrowsePath.AllFiles="Όλα τα αρχεία"
|
||||
KeyColorType="Βασικό χρώμα τύπου"
|
||||
KeyColor="Βασικό χρώμα"
|
||||
Similarity="Ομοιότητα (1-1000)"
|
||||
Smoothness="Ομαλότητα (1-1000)"
|
||||
ColorSpillReduction="Βασικό χρώμα πετρελαιοκηλίδα μείωση (1-1000)"
|
||||
Crop.Left="Αριστερά"
|
||||
Crop.Right="Δεξιά"
|
||||
Crop.Top="Πάνω"
|
||||
|
|
@ -36,15 +49,29 @@ Red="Κόκκινο"
|
|||
Green="Πράσινο"
|
||||
Blue="Μπλε"
|
||||
Magenta="Ματζέντα"
|
||||
NoiseGate.OpenThreshold="Ανοικτό όριο (dB)"
|
||||
NoiseGate.CloseThreshold="Κλείστό όριο (dB)"
|
||||
NoiseGate.AttackTime="Χρόνος προσβολής (msec)"
|
||||
NoiseGate.HoldTime="Χρόνος αναμονής (msec)"
|
||||
NoiseGate.ReleaseTime="Χρόνος διάχυσης (msec)"
|
||||
Gain.GainDB="Απολαβή (dB)"
|
||||
StretchImage="Τέντωση εικόνας (απόρριψη αναλογίας εικόνας)"
|
||||
Resolution="Ανάλυση"
|
||||
None="Καμία"
|
||||
ScaleFiltering="Κλίμακα φιλτραρίσματος"
|
||||
ScaleFiltering.Point="Σημείο"
|
||||
ScaleFiltering.Bilinear="Διγραμμικές"
|
||||
ScaleFiltering.Bicubic="Δικυβική"
|
||||
ScaleFiltering.Lanczos="Lanczos"
|
||||
NoiseSuppress.SuppressLevel="Καταστολή επιπέδου (dB)"
|
||||
Saturation="Κορεσμός"
|
||||
HueShift="Μετατόπιση Απόχρωσης"
|
||||
Amount="Ποσό"
|
||||
Compressor="Συμπιεστής"
|
||||
Compressor.Ratio="Αναλογία (X:1)"
|
||||
Compressor.Threshold="Κατώφλι (dB)"
|
||||
Compressor.AttackTime="Επίθεση (ms)"
|
||||
Compressor.ReleaseTime="Απελευθέρωση (ms)"
|
||||
Compressor.OutputGain="Εξόδου κέρδος (dB)"
|
||||
Compressor.SidechainSource="Πηγή sidechain/βουτιά"
|
||||
|
||||
|
|
|
|||
26
plugins/obs-filters/data/locale/gd-GB.ini
Normal file
26
plugins/obs-filters/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
ScrollFilter="Sgrolaich"
|
||||
SharpnessFilter="Geuraich"
|
||||
Type="Seòrsa"
|
||||
Path="Slighe"
|
||||
Color="Dath"
|
||||
Contrast="Iomsgaradh"
|
||||
Brightness="Soilleireachd"
|
||||
BrowsePath.AllFiles="A h-uile faidhle"
|
||||
Crop.Left="Clì"
|
||||
Crop.Right="Deas"
|
||||
Crop.Top="Barr"
|
||||
Crop.Bottom="Bonn"
|
||||
Crop.Width="Leud"
|
||||
Crop.Height="Àirde"
|
||||
Red="Dearg"
|
||||
Green="Uaine"
|
||||
Blue="Gorm"
|
||||
Resolution="Dùmhlachd-bhreacaidh"
|
||||
None="Chan eil gin"
|
||||
ScaleFiltering="Criathradh sgèilidh"
|
||||
ScaleFiltering.Point="Puing"
|
||||
ScaleFiltering.Bilinear="Dà-loidhneach"
|
||||
ScaleFiltering.Bicubic="Dà-chiùbach"
|
||||
ScaleFiltering.Lanczos="Lanczos"
|
||||
Saturation="Sàthachd"
|
||||
|
||||
|
|
@ -1,4 +1,77 @@
|
|||
ColorFilter="ფერთა გასწორება"
|
||||
ColorGradeFilter="LUT-ის ასახვა"
|
||||
MaskFilter="სურათის ნიღაბი/შერევა"
|
||||
AsyncDelayFilter="ვიდეოს დაყოვნება (ასინქრონული)"
|
||||
CropFilter="შემოჭრა/არეები"
|
||||
ScrollFilter="გადაადგილება"
|
||||
ChromaKeyFilter="ფონის ჩანაცვლება (Chroma Key)"
|
||||
ColorKeyFilter="ფერის ჩანაცვლება (Color Key)"
|
||||
SharpnessFilter="სიმკვეთრის მომატება"
|
||||
ScaleFilter="ზომების ცვლილება/გვერდების თანაფარდობა"
|
||||
GPUDelayFilter="დაყოვნება დამუშავებისას"
|
||||
UndistortCenter="ზეფართო სურათის შუაგულის გამრუდების არიდება, ზომების შეცვლისას"
|
||||
NoiseGate="ხმაურის შეზღუდვა"
|
||||
NoiseSuppress="ხმაურის დახშობა"
|
||||
Gain="სიგნალის გაძლიერება"
|
||||
DelayMs="დაყოვნება (მილიწამი)"
|
||||
Type="სახეობა"
|
||||
MaskBlendType.MaskColor="ალფა-ნიღაბი (ფერის არხი)"
|
||||
MaskBlendType.MaskAlpha="ალფა-ნიღაბი (გამჭვირვალობის არხი)"
|
||||
MaskBlendType.BlendMultiply="შერევა (გამრავლება)"
|
||||
MaskBlendType.BlendAddition="შერევა (დამატება)"
|
||||
MaskBlendType.BlendSubtraction="შერევა (გამოკლება)"
|
||||
Path="მისამართი"
|
||||
Color="ფერი"
|
||||
Opacity="გაუმჭვირვალობა"
|
||||
Contrast="კონტრასტი"
|
||||
Brightness="სიკაშკაშე"
|
||||
Gamma="ფერთა გამა"
|
||||
BrowsePath.Images="ყველანაირი სურათი"
|
||||
BrowsePath.AllFiles="ყველა ფაილი"
|
||||
KeyColorType="საკვანძო ფერის სახე"
|
||||
KeyColor="საკვანძო ფერი"
|
||||
Similarity="მსგავსება (1-1000)"
|
||||
Smoothness="სიგლუვე (1-1000)"
|
||||
ColorSpillReduction="საკვანძო ფერთა გაბნევის შემცირება (1-1000)"
|
||||
Crop.Left="მარცხენა"
|
||||
Crop.Right="მარჯვენა"
|
||||
Crop.Top="ზედა"
|
||||
Crop.Bottom="ქვედა"
|
||||
Crop.Width="სიგანე"
|
||||
Crop.Height="სიმაღლე"
|
||||
Crop.Relative="თანაფარდობა"
|
||||
ScrollFilter.SpeedX="თარაზული სიჩქარე"
|
||||
ScrollFilter.SpeedY="შვეული სიჩქარე"
|
||||
ScrollFilter.LimitWidth="სიგანის შეზღუდვა"
|
||||
ScrollFilter.LimitHeight="სიმაღლის შეზღუდვა"
|
||||
CustomColor="მითითებული ფერი"
|
||||
Red="წითელი"
|
||||
Green="მწვანე"
|
||||
Blue="ლურჯი"
|
||||
Magenta="მეწამული"
|
||||
NoiseGate.OpenThreshold="ქვედა ზღურბლი (dB)"
|
||||
NoiseGate.CloseThreshold="ზედა ზღურბლი (dB)"
|
||||
NoiseGate.AttackTime="მომატების (Attack) ხანგრძლივობა (მილიწამი)"
|
||||
NoiseGate.HoldTime="დაყოვნების (Hold) ხანგრძლივობა (მილიწამი)"
|
||||
NoiseGate.ReleaseTime="შემცირების (Release) ხანგრძლივობა (მილიწამი)"
|
||||
Gain.GainDB="გაძლიერება (dB)"
|
||||
StretchImage="სურათის გაწელვა (გვერდების თანაფარდობის უგულებელყოფა)"
|
||||
Resolution="გაფართოება"
|
||||
None="არცერთი"
|
||||
ScaleFiltering="მასშტაბირების ფილტრი"
|
||||
ScaleFiltering.Point="წერტილოვანი"
|
||||
ScaleFiltering.Bilinear="ორხაზოვანი"
|
||||
ScaleFiltering.Bicubic="ბიკუბური"
|
||||
ScaleFiltering.Lanczos="Lanczos"
|
||||
NoiseSuppress.SuppressLevel="დახშობის ხარისხი (dB)"
|
||||
Saturation="გაჯერებულობა"
|
||||
HueShift="შეფერილობის შეცვლა"
|
||||
Amount="რაოდენობა"
|
||||
Compressor="დამხშობი"
|
||||
Compressor.Ratio="ფარდობა (X:1)"
|
||||
Compressor.Threshold="ზღურბლი (dB)"
|
||||
Compressor.AttackTime="მომატება (მწ)"
|
||||
Compressor.ReleaseTime="შემცირება (მწ)"
|
||||
Compressor.OutputGain="გამომავალი სიგნალის გაძლიერება (dB)"
|
||||
Compressor.SidechainSource="Sidechain/ხმის დონის დადაბლების წყარო"
|
||||
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ Red="Đỏ"
|
|||
Green="Xanh"
|
||||
Blue="Xanh nước biển"
|
||||
Magenta="Đỏ tươi"
|
||||
Resolution="Độ phân giải"
|
||||
None="Không có"
|
||||
Saturation="Độ bão hoà"
|
||||
|
||||
|
|
|
|||
|
|
@ -41,8 +41,8 @@ struct noise_gate_data {
|
|||
float held_time;
|
||||
};
|
||||
|
||||
#define VOL_MIN -96.0f
|
||||
#define VOL_MAX 0.0f
|
||||
#define VOL_MIN -96.0
|
||||
#define VOL_MAX 0.0
|
||||
|
||||
static const char *noise_gate_name(void *unused)
|
||||
{
|
||||
|
|
@ -155,8 +155,8 @@ static struct obs_audio_data *noise_gate_filter_audio(void *data,
|
|||
|
||||
static void noise_gate_defaults(obs_data_t *s)
|
||||
{
|
||||
obs_data_set_default_double(s, S_OPEN_THRESHOLD, -26.0f);
|
||||
obs_data_set_default_double(s, S_CLOSE_THRESHOLD, -32.0f);
|
||||
obs_data_set_default_double(s, S_OPEN_THRESHOLD, -26.0);
|
||||
obs_data_set_default_double(s, S_CLOSE_THRESHOLD, -32.0);
|
||||
obs_data_set_default_int (s, S_ATTACK_TIME, 25);
|
||||
obs_data_set_default_int (s, S_HOLD_TIME, 200);
|
||||
obs_data_set_default_int (s, S_RELEASE_TIME, 150);
|
||||
|
|
@ -167,9 +167,9 @@ static obs_properties_t *noise_gate_properties(void *data)
|
|||
obs_properties_t *ppts = obs_properties_create();
|
||||
|
||||
obs_properties_add_float_slider(ppts, S_CLOSE_THRESHOLD,
|
||||
TEXT_CLOSE_THRESHOLD, VOL_MIN, VOL_MAX, 1.0f);
|
||||
TEXT_CLOSE_THRESHOLD, VOL_MIN, VOL_MAX, 1.0);
|
||||
obs_properties_add_float_slider(ppts, S_OPEN_THRESHOLD,
|
||||
TEXT_OPEN_THRESHOLD, VOL_MIN, VOL_MAX, 1.0f);
|
||||
TEXT_OPEN_THRESHOLD, VOL_MIN, VOL_MAX, 1.0);
|
||||
obs_properties_add_int(ppts, S_ATTACK_TIME, TEXT_ATTACK_TIME,
|
||||
0, 10000, 1);
|
||||
obs_properties_add_int(ppts, S_HOLD_TIME, TEXT_HOLD_TIME,
|
||||
|
|
|
|||
|
|
@ -121,10 +121,10 @@ static obs_properties_t *scroll_filter_properties(void *data)
|
|||
|
||||
obs_properties_add_float_slider(props, "speed_x",
|
||||
obs_module_text("ScrollFilter.SpeedX"),
|
||||
-500.0f, 500.0f, 1.0f);
|
||||
-500.0, 500.0, 1.0);
|
||||
obs_properties_add_float_slider(props, "speed_y",
|
||||
obs_module_text("ScrollFilter.SpeedY"),
|
||||
-500.0f, 500.0f, 1.0f);
|
||||
-500.0, 500.0, 1.0);
|
||||
|
||||
p = obs_properties_add_bool(props, "limit_cx",
|
||||
obs_module_text("ScrollFilter.LimitWidth"));
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ static obs_properties_t *sharpness_properties(void *data)
|
|||
obs_properties_t *props = obs_properties_create();
|
||||
|
||||
obs_properties_add_float_slider(props, "sharpness",
|
||||
"Sharpness", 0.0f, 1.0f, 0.01f);
|
||||
"Sharpness", 0.0, 1.0, 0.01);
|
||||
|
||||
UNUSED_PARAMETER(data);
|
||||
return props;
|
||||
|
|
|
|||
4
plugins/obs-libfdk/data/locale/gd-GB.ini
Normal file
4
plugins/obs-libfdk/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
LibFDK="Inneal-còdachaidh libfdk AAC"
|
||||
Bitrate="Reat bhiotaichean"
|
||||
Afterburner="Cuir an comas Afterburner AAC"
|
||||
|
||||
4
plugins/obs-libfdk/data/locale/ka-GE.ini
Normal file
4
plugins/obs-libfdk/data/locale/ka-GE.ini
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
LibFDK="libfdk AAC დამშიფრავი"
|
||||
Bitrate="ბიტური სიხშირე"
|
||||
Afterburner="AAC Afterburner-ის ჩართვა"
|
||||
|
||||
|
|
@ -1,2 +1,4 @@
|
|||
LibFDK="لابفدک AAC انکوڈر"
|
||||
Bitrate="بٹ شرح"
|
||||
Afterburner="بٹرا قابل اطلاق AAC بعدبورنر"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,20 +1,25 @@
|
|||
project(obs-outputs)
|
||||
|
||||
option(USE_SSL "Enable rtmps support with OpenSSL" OFF)
|
||||
set(WITH_RTMPS AUTO CACHE STRING "Enable RTMPS support with mbedTLS")
|
||||
set_property(CACHE WITH_RTMPS PROPERTY STRINGS AUTO ON OFF)
|
||||
|
||||
if (USE_SSL)
|
||||
find_package(SSL QUIET)
|
||||
option(STATIC_MBEDTLS "Statically link mbedTLS into binary" OFF)
|
||||
|
||||
if (WITH_RTMPS OR (WITH_RTMPS STREQUAL "AUTO"))
|
||||
find_package(MbedTLS QUIET)
|
||||
find_package(ZLIB QUIET)
|
||||
endif()
|
||||
|
||||
if (SSL_FOUND AND ZLIB_FOUND)
|
||||
add_definitions(-DCRYPTO -DUSE_OPENSSL)
|
||||
include_directories(${SSL_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS})
|
||||
if (LIBMBEDTLS_FOUND AND ZLIB_FOUND)
|
||||
add_definitions(-DCRYPTO -DUSE_MBEDTLS)
|
||||
include_directories(${LIBMBEDTLS_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS})
|
||||
else()
|
||||
if (USE_SSL)
|
||||
message(WARNING "SSL enabled by user, but OpenSSL was not found")
|
||||
if(WITH_RTMPS STREQUAL "AUTO")
|
||||
message(WARNING "mbedTLS was not found, RTMPS will be auto-disabled")
|
||||
elseif (WITH_RTMPS)
|
||||
message(FATAL_ERROR "RTMPS enabled by user, but mbedTLS was not found")
|
||||
endif()
|
||||
unset(SSL_LIBRARIES)
|
||||
unset(LIBMBEDTLS_LIBRARIES)
|
||||
unset(ZLIB_LIBRARIES)
|
||||
add_definitions(-DNO_CRYPTO)
|
||||
endif()
|
||||
|
|
@ -84,6 +89,12 @@ if(WIN32)
|
|||
ws2_32
|
||||
winmm
|
||||
Iphlpapi)
|
||||
|
||||
if (WITH_RTMPS OR (WITH_RTMPS STREQUAL "AUTO"))
|
||||
SET(obs-outputs_PLATFORM_DEPS
|
||||
${obs-outputs_PLATFORM_DEPS}
|
||||
crypt32)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
|
|
@ -92,6 +103,16 @@ if(MSVC)
|
|||
w32-pthreads)
|
||||
endif()
|
||||
|
||||
if(APPLE AND (WITH_RTMPS OR (WITH_RTMPS STREQUAL "AUTO")))
|
||||
find_library(FOUNDATION_FRAMEWORK Foundation)
|
||||
find_library(SECURITY_FRAMEWORK Security)
|
||||
|
||||
set(obs-outputs_PLATFORM_DEPS
|
||||
${obs-outputs_PLATFORM_DEPS}
|
||||
${FOUNDATION_FRAMEWORK}
|
||||
${SECURITY_FRAMEWORK})
|
||||
endif()
|
||||
|
||||
set(obs-outputs_librtmp_HEADERS
|
||||
librtmp/amf.h
|
||||
librtmp/bytes.h
|
||||
|
|
@ -133,7 +154,7 @@ set(obs-outputs_SOURCES
|
|||
flv-output.c
|
||||
flv-mux.c
|
||||
net-if.c)
|
||||
|
||||
|
||||
add_library(obs-outputs MODULE
|
||||
${ftl_SOURCES}
|
||||
${ftl_HEADERS}
|
||||
|
|
@ -143,7 +164,7 @@ add_library(obs-outputs MODULE
|
|||
${obs-outputs_librtmp_HEADERS})
|
||||
target_link_libraries(obs-outputs
|
||||
libobs
|
||||
${SSL_LIBRARIES}
|
||||
${LIBMBEDTLS_LIBRARIES}
|
||||
${ZLIB_LIBRARIES}
|
||||
${ftl_IMPORTS}
|
||||
${obs-outputs_PLATFORM_DEPS})
|
||||
|
|
|
|||
|
|
@ -2,5 +2,8 @@ RTMPStream="تيار RTMP"
|
|||
RTMPStream.DropThreshold="انخفاض البداية (مللي ثانية)"
|
||||
FLVOutput="اخراج الملف بصيغة FLV"
|
||||
FLVOutput.FilePath="مسار الملف"
|
||||
Default="Default"
|
||||
|
||||
ConnectionTimedOut="انتهت مهلة الاتصال. تأكد من أن قمت بتكوين خدمة البث صالحة ولا جدار الحماية بحظر الاتصال."
|
||||
ConnectionReset="The connection was reset by the peer. This usually indicates internet connection problems between you and the streaming service."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="La connexió s'ha acabat. Normalment això indica que hi ha pro
|
|||
HostNotFound="Nom d'amfitrió no trobat. Assegureu-vos que hi hagi configurat un servidor de transmissió vàlid i que la seva connexió a Internet / DNS estiguin funcionant correctament."
|
||||
NoData="Nom d'amfitrió trobat, però no hi ha dades del tipus sol·licitat. Això pot passar si heu enllaçat a una adreça IPv6 i el seu servei de transmissió només té adreces IPv4 (veure configuració / avançada)."
|
||||
AddressNotAvailable="Direcció no disponible. Potser heu intentat enllaçar amb una adreça IP no vàlida (veure configuració / avançada)."
|
||||
SSLCertVerifyFailed="El servidor RTMP ha enviat un certificat SSL no vàlid."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="Připojení bylo resetováno druhou stranou. Toto obvykle zname
|
|||
HostNotFound="Hostitel nebyl nalezen. Zkontrolujte, zda jste zadali správný vysílací server a že vaše připojení k internetu / DNS funguje jak má."
|
||||
NoData="Hostitel byl nalezen, ale žádná data požadovaného typu. Toto se může stát, pokud používáte IPv6 adresu, ale vaše vysílací služba podporuje pouze připojení přes svou IPv4 adresu (viz. Nastavení / Rozšířené)."
|
||||
AddressNotAvailable="Adresa není k dispozici. Možná jste se snažili použít chybnou IP adresu (viz. Nastavení / Rozšířené)."
|
||||
SSLCertVerifyFailed="RTMP server odeslal neplatný SSL certifikát."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="Forbindelsen blev afbrudt. Dette indikerer typisk et problem me
|
|||
HostNotFound="Værtsnavn ikke fundet. Tjek at du har angivet en gyldig streaming-server, og at din Internetforbindelse/DNS fungerer korrekt."
|
||||
NoData="Værtsnavn fundet, men ingen data af den ønskede type. Dette kan forekomme, hvis du har tildelt en IPv6-adresse, og din streaming-tjeneste kun benytter IPv4-adresser (se Indstillinger/Avanceret)."
|
||||
AddressNotAvailable="Adresse utilgængelig. Du kan have forsøgt at tildele en ugyldig IP-adresse (se Indstillinger/Avanceret)."
|
||||
SSLCertVerifyFailed="RTMP-serveren har sendt et ugyldig SSL-certifikat."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="Die Verbindung wurde durch Kommunikationspartner zurückgesetzt
|
|||
HostNotFound="Hostname nicht gefunden. Stellen Sie sicher, dass Sie einen gültigen Streaming-Server eingegeben haben und Ihre Internetverbindung / DNS korrekt arbeiten."
|
||||
NoData="Hostname gefunden, aber keine Daten des angeforderten Typs. Dies kann auftreten, wenn Sie eine IPv6-Adresse verwenden und Ihr Streaming-Dienst nur über IPv4-Adressen verfügt (siehe Einstellungen / Erweitert)."
|
||||
AddressNotAvailable="Adresse nicht Verfügbar. Sie haben möglicherweise versucht, eine ungültige IP-Adresse zu verwenden (siehe Einstellungen / Erweitert)."
|
||||
SSLCertVerifyFailed="Der RTMP-Server hat ein ungültiges SSL-Zertifikat gesendet."
|
||||
|
||||
|
|
|
|||
|
|
@ -4,4 +4,11 @@ FLVOutput="FLV Αρχείο Εξόδου"
|
|||
FLVOutput.FilePath="Διαδρομή Αρχείου"
|
||||
Default="Προεπιλογή"
|
||||
|
||||
ConnectionTimedOut="Εξαντλήθηκε το χρονικό όριο της σύνδεσης. Βεβαιωθείτε ότι έχετε ρυθμίσει μια έγκυρη υπηρεσία συνεχούς ροής και το τείχος προστασίας δεν εμποδίζει τη σύνδεση."
|
||||
PermissionDenied="Αποκλείστηκε η σύνδεση. Ελέγξτε το τείχος προστασίας / ρυθμίσεις προστασίας από ιούς για να βεβαιωθείτε οτι στο OBS επιτρέπεται να έχει πλήρης πρόσβαση στο διαδίκτυο."
|
||||
ConnectionAborted="Η σύνδεση ματαιώθηκε. Αυτό συνήθως υποδεικνύει προβλήματα σύνδεσης στο διαδίκτυο ανάμεσα σε εσάς και την υπηρεσία συνεχούς ροής."
|
||||
ConnectionReset="Η σύνδεση ήταν επαναφέρθηκε στον ομότιμο υπολογιστή. Αυτό συνήθως υποδεικνύει προβλήματα σύνδεσης στο διαδίκτυο ανάμεσα σε εσάς και την υπηρεσία συνεχούς ροής."
|
||||
HostNotFound="Το όνομα του κεντρικού υπολογιστή δεν βρέθηκε. Βεβαιωθείτε ότι πληκτρολογήσατε έναν έγκυρο διακομιστή συνεχούς ροής και η σύνδεση στο διαδίκτυο / DNS λειτουργεί σωστά."
|
||||
NoData="Το όνομα του κεντρικού υπολογιστή βρέθηκε, αλλά χωρίς δεδομένα του ζητούμενου τύπου. Αυτό μπορεί να συμβεί αν έχετε δεσμεύσει μια διεύθυνση IPv6 και για την υπηρεσία συνεχούς ροής μόνο διευθύνσεις IPv4 (ανατρέξτε στην ενότητα ρυθμίσεις)."
|
||||
AddressNotAvailable="Η διεύθυνση δεν είναι διαθέσιμη. Μπορεί να έχετε δοκιμάσει να συνδεθείτε σε μια άκυρη διεύθυνση IP (βλ. ρυθμίσεις)."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,3 +11,4 @@ ConnectionReset="The connection was reset by the peer. This usually indicates in
|
|||
HostNotFound="Hostname not found. Make sure you entered a valid streaming server and your internet connection / DNS are working correctly."
|
||||
NoData="Hostname found, but no data of the requested type. This can occur if you have bound to an IPv6 address and your streaming service only has IPv4 addresses (see Settings / Advanced)."
|
||||
AddressNotAvailable="Address not available. You may have tried to bind to an invalid IP address (see Settings / Advanced)."
|
||||
SSLCertVerifyFailed="The RTMP server sent an invalid SSL certificate."
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="La conexión se ha terminado. Normalmente esto indica que hay p
|
|||
HostNotFound="Nombre de host no encontrado. Asegúrese que haya configurado un servidor de transmisión valido y que su conexión a Internet / DNS estén funcionando correctamente."
|
||||
NoData="Nombre de host encontrado, pero no hay datos del tipo solicitado. Esto puede ocurrir si has enlazado a una dirección IPv6 y su servicio de streaming sólo tiene direcciones IPv4 (ver Configuración / Avanzada)."
|
||||
AddressNotAvailable="Dirección no disponible. Puede que hayas intentado enlazar con una dirección IP no valida (vea Configuración / Avanzado)."
|
||||
SSLCertVerifyFailed="El servidor RTMP envió un certificado SSL no válido."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="Pareak berrezarri du konexioa. Transmisioaren zerbitzurekin kon
|
|||
HostNotFound="Ez da ostalari-izena topatu. Egiaztatu baliozko transmisio zerbitzaria jarri duzula eta zure Internet-konexioa eta DNSa zuzen ari direla lanean."
|
||||
NoData="Ostalari-izena topatu da baina eskatutako datu motatik batere ez. Gerta daiteke IPv6 helbide bat eskatu izana eta zure transmisio zerbitzuak bakarrik onartzea IPv4 helbideak (Ikus ezarpen aurreratuak)."
|
||||
AddressNotAvailable="Helbidea ez dago eskuragarri. Agian saiatu zara baliozkoa ez den IP helbide batera konektatzen (ikus ezarpen aurreratuak)."
|
||||
SSLCertVerifyFailed="RTMP zerbitzariak baliorik gabeko SSL ziurtagiria bidali du."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="Yhteys katkaistiin. Tämä tarkoittaa yleensä yhteysongelmia s
|
|||
HostNotFound="Isäntänimeä ei löytynyt. Varmista että syötit voimassaolevan lähetyspalvelimen ja että internet-yhteytesi tai DNS-palvelimesi toimivat oikein."
|
||||
NoData="Isäntänimi löytyi, mutta ei oikeanlaista pyydettyä dataa. Näin voi tapahtua jos olet rajannut yhteytesi IPv6 -osoitteeseen ja lähetyspalvelusi tukee vain IPv4-osoitteita (Katso Asetukset / Lisäasetukset)."
|
||||
AddressNotAvailable="Osoite ei ole saatavilla. Voi olla että yritit kiinnittää väärän IP-osoitteen (Katso Asetukset / Lisäasetukset)."
|
||||
SSLCertVerifyFailed="RTMP-palvelin lähetti virheellisen SSL-sertifikaatin."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="La connexion à été interrompue. Cela indique généralement
|
|||
HostNotFound="Nom d’hôte non trouvé. Assurez-vous que vous avez spécifié un serveur de diffusion valide et que votre connexion internet / DNS fonctionnent correctement."
|
||||
NoData="Nom d’hôte trouvé, mais aucune donnée du type requis. Cela peut se produire si vous avez lié à une adresse IPv6 et votre service de diffusion ne possède que des adresses IPv4 (voir Paramètres / Avancé)."
|
||||
AddressNotAvailable="Adresse non disponible. Vous avez peut-être essayé de la lier à une adresse IP non valide (voir Paramètres / Avancé)."
|
||||
SSLCertVerifyFailed="Le serveur RTMP a fourni un certificat SSL incorrect."
|
||||
|
||||
|
|
|
|||
7
plugins/obs-outputs/data/locale/gd-GB.ini
Normal file
7
plugins/obs-outputs/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
RTMPStream="Sruthadh RTMP"
|
||||
RTMPStream.DropThreshold="Stairsneach an tuiteim (mille-dhiog)"
|
||||
FLVOutput="Às-chur faidhle FLV"
|
||||
FLVOutput.FilePath="Slighe an fhaidhle"
|
||||
Default="Bun-roghainn"
|
||||
|
||||
|
||||
|
|
@ -11,4 +11,5 @@ ConnectionReset="A kapcsolat a peer által megszakítva. Ez általában azt jelz
|
|||
HostNotFound="A hostnév nem található. Győződjön meg róla, hogy érvényes stream szervert adott meg és az internetkapcsolata / DNS szerver megfelelően működik."
|
||||
NoData="Hostnév megtalálva, viszont a kért típusú állomány nem elérhető. Ez akkor fordul elő, ha IPv6 címhez van rendelve és a stream kiszolgálójának csak IPv4 címei állnak rendelkezésre (lásd: Beállítások / Haladó)."
|
||||
AddressNotAvailable="A cím nem elérhető. Valószínűleg egy érvénytelen IP címet adott meg (Lásd: Beállítások / Haladó)."
|
||||
SSLCertVerifyFailed="Az RTMP kiszolgáló által küldött SSL tanúsítvány érvénytelen."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="接続はピアによってリセットされました。 ス
|
|||
HostNotFound="ホスト名が見つかりません。 有効なストリーミングサーバーを入力していることとインターネット接続/DNSが正しく機能していることを確認してください。"
|
||||
NoData="ホスト名が見つかりましたが、要求されたタイプのデータがありません。 これはIPv6アドレスにバインドしている状態でストリーミングサービスにIPv4アドレスしかない場合に発生します。 (設定 / 詳細設定 を参照)"
|
||||
AddressNotAvailable="アドレスを利用できません。 無効なIPアドレスにバインドしようとした可能性があります。 (設定 / 詳細設定 を参照)"
|
||||
SSLCertVerifyFailed="RTMPサーバーが無効なSSL証明書を送信しました。"
|
||||
|
||||
|
|
|
|||
15
plugins/obs-outputs/data/locale/ka-GE.ini
Normal file
15
plugins/obs-outputs/data/locale/ka-GE.ini
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
RTMPStream="RTMP ნაკადი"
|
||||
RTMPStream.DropThreshold="ქვედა ზღურბლი (მილიწამი)"
|
||||
FLVOutput="გამომავალი FLV ფაილი"
|
||||
FLVOutput.FilePath="ფაილის მისამართი"
|
||||
Default="ნაგულისხმევი"
|
||||
|
||||
ConnectionTimedOut="კავშირის ვადა ამოიწურა. გადაამოწმეთ, სწორად გაქვთ თუ არა გამართული ნაკადის გაშვების მომსახურება და ქსელის ფარი ხომ არ ზღუდავს კავშირს."
|
||||
PermissionDenied="კავშირი შეიზღუდა. გადაამოწმეთ ქსელის ფარის ან ანტივირუსული პროგრამის პარამეტრები და დარწმუნდით, რომ OBS-ს აქვს სრული დაშვება ინტერნეტთან."
|
||||
ConnectionAborted="კავშირი გაუქმდა. ძირითადად, ეს მიუთითებს ინტერნეტკავშირის ხარვეზების არსებობას, თქვენსა და ნაკადის გაშვების მომსახურების მომწოდებელს შორის."
|
||||
ConnectionReset="კავშირი გაწყდა ერთ-ერთი მხარის მიერ. ძირითადად, ეს მიუთითებს ინტერნეტკავშირის ხარვეზების არსებობას, თქვენსა და ნაკადის გაშვების მომსახურების მომწოდებელს შორის."
|
||||
HostNotFound="დაკავშირების წერტილი ვერ მოიძებნა. დარწმუნდით, რომ სწორად უთითებთ ნაკადის გაშვების მომსახურების მონაცემებს და თქვენი DNS / ინტერნეტკავშირის პარამეტრებიც სწორადაა გამართული."
|
||||
NoData="დაკავშირების წერტილი მოიძებნა, მაგრამ მოთხოვნილი სახის მონაცემები არა. ეს შეიძლება გამოწვეული იყოს იმით, რომ თქვენ უკავშირდებით IPv6 მისამართზე, ხოლო თქვენს ნაკადის გაშვების მომსახურებას, მხოლოდ IPv4 მისამართები გააჩნია (იხილეთ პარამეტრები / დამატებითი)."
|
||||
AddressNotAvailable="მისამართი მიუწვდომელია. შესაძლოა, თქვენ ცდილობთ მცდარ IP მისამართზე დაკავშირებას (იხილეთ პარამეტრები / დამატებითი)."
|
||||
SSLCertVerifyFailed="RTMP სერვერმა გაგზავნა არამართებული SSL სერტიფიკატი."
|
||||
|
||||
|
|
@ -11,4 +11,5 @@ ConnectionReset="상호 연결 문제로 초기화되었습니다. 보통 사용
|
|||
HostNotFound="호스트 이름을 찾을 수 없습니다. 방송 서버 정보가 제대로 입력되었는지 확인하고, 인터넷 접속 혹은 DNS가 제대로 작동하고 있는지 점검하십시오."
|
||||
NoData="호스트 이름은 찾았지만 요청한 형식의 데이터가 없습니다. 이 문제는 보통 사용자가 IPv6 형식의 주소를 고정하여 사용하면서 IPv4 형식의 주소만 지원하는 방송 서비스에 접속을 시도한 경우 나타납니다 (설정 / 고급 창을 확인하십시오)."
|
||||
AddressNotAvailable="주소를 사용할 수 없습니다. 잘못된 IP주소를 고정하고 있습니다 (설정 / 고급 창을 확인하십시오)."
|
||||
SSLCertVerifyFailed="해당 RTMP 서버는 잘못된 SSL 인증서를 보냈습니다."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="Tilkoblingen ble avbrutt. Dette betyr vanligvis at det er probl
|
|||
HostNotFound="Tjeneren ble ikke funnet. Kontroller at du har angitt en gyldig streaming server og at tilkoblingen / DNS fungerer."
|
||||
NoData="Tjeneren funnet, men ingen data for den forespurte typen. Dette kan skje hvis du har bundet til en IPv6-adresse og streaming tjeneste har bare IPv4-adresser (se Snnstillinger / Avansert)."
|
||||
AddressNotAvailable="Adresse ikke tilgjengelig. Du prøvde å binde til en ugyldig IP-adresse (se Innstillinger / Avansert)."
|
||||
SSLCertVerifyFailed="RTMP-tjeneren sendte et ugyldig SSL-sertifikat."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="De verbinding was gereset door de andere partij. Dit duidt mees
|
|||
HostNotFound="Hostname niet gevonden. Controleer dat je een geldige streaming service hebt ingevuld en dat je internetverbinding / DNS correct werken."
|
||||
NoData="Hostname gevonden, maar geen data van het verwachte type. Dit kan gebeuren als je aan een IPv6 adres hebt gebonden, en je streaming service alleen IPv4 adressen heeft (zie Instellingen / Geavanceerd)."
|
||||
AddressNotAvailable="Adres niet beschikbaar. Je hebt misschien geprobeerd om aan een ongeldig IP adres te binden (zie Instellingen / Geavanceerd)."
|
||||
SSLCertVerifyFailed="De RTMP-server heeft een ongeldig SSL-certificaat verzonden."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="Połączenie zostało przerwane po stronie serwera. Wskazuje to
|
|||
HostNotFound="Nie znaleziono nazwy hosta. Upewnij się, że wprowadzono prawidłowe dane serwera przesyłania strumieniowego i połączenie z internetem / DNS są poprawne."
|
||||
NoData="Nazwa serwera została znaleziona ale nie stwierdzono poprawności odbieranych danych. Dzieje się tak najczęściej po przypisaniu aplikacji do adresu IPv6, gdy usługa strumieniowania obsługuje jedynie adresy IPv4 (zobacz Ustawienia -> Zaawansowane)."
|
||||
AddressNotAvailable="Adres IP niedostępny. Być może powiązano aplikację z nieprawidłowym adresem IP (zobacz Ustawienia -> Zaawansowane)."
|
||||
SSLCertVerifyFailed="Serwer RTMP wysłał nieprawidłowy certyfikat SSL."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="A conexão foi redefinida pelo usuário. Isso geralmente indica
|
|||
HostNotFound="Host não encontrado. Verifique se você inseriu um servidor válido de transmissão e se sua conexão de internet / DNS estão funcionando corretamente."
|
||||
NoData="Host encontrado, mas não há dados do tipo solicitado. Isso pode ocorrer se você tiver vinculado a um endereço IPv6 e seu serviço de transmissão tem apenas endereços IPv4 (consulte Configurações / Avançado)."
|
||||
AddressNotAvailable="Endereço não disponível. Você pode ter tentado se vincular a um endereço IP inválido (consulte Configurações / Avançado)."
|
||||
SSLCertVerifyFailed="O servidor RTMP enviou um certificado SSL inválido."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="Соединение было сброшено одноранг
|
|||
HostNotFound="Имя узла не найдено. Убедитесь, что вы ввели действительный сервер вещания и ваше подключение к интернету/DNS работают правильно."
|
||||
NoData="Имя узла найдено, но нет данных запрошенного типа. Такое может случиться, если вы привязаны к IPv6-адресу, а ваш сервис вещания имеет только IPv4-адреса (смотрите Настройки - Расширенные)."
|
||||
AddressNotAvailable="Адрес недоступен. Возможно вы пытались привязаться к недействительному IP-адресу (смотрите Настройки - Расширенные)."
|
||||
SSLCertVerifyFailed="RTMP сервер отправил недействительный сертификат SSL."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="Anslutningen återställdes av en peer. Detta kan indikera prob
|
|||
HostNotFound="Värdnamnet hittades inte. Se till att du har angivit en giltigt strömningstjänst och att din Internetanslutning / DNS fungerar på rätt sätt."
|
||||
NoData="Värdnamnet hittades, men ingen data av den begärda typen. Detta kan hända om du ansluter till en IPv6-adress och din strömningstjänst endast har IPv4-adresser (gå till Inställningar / Avancerat)."
|
||||
AddressNotAvailable="Adressen är inte tillgänglig. Du kanske försökte ansluta till en ogiltig IP-adress (gå till Inställningar / Avancerat)."
|
||||
SSLCertVerifyFailed="RTMP-servern skickade ett ogiltigt SSL-certifikat."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="Bağlantı karşı taraftan sıfırlandı. Bu genellikle sizin
|
|||
HostNotFound="Ana bilgisayar adı bulunamadı. Geçerli bir yayın sunucusu girdiğinizden ve internet bağlantınızın / DNS'nizin düzgün çalıştığını emin olun."
|
||||
NoData="Ana bilgisayar adı bulundu, ancak istenen türde veri bulunamadı. Bu bir IPv6 adresine bağlamış ve yayın servisinizin sadece IPv4 adresleri varsa oluşabilir (bkz: Ayarlar / Gelişmiş)."
|
||||
AddressNotAvailable="Adres kullanılamaz. Geçersiz bir IP adresi bağlamayı denemiş olabilirsiniz (bakın: Ayarlar / Gelişmiş)."
|
||||
SSLCertVerifyFailed="RTMP sunucusu geçersiz bir SSL sertifikası gönderdi."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="З'єднання було скинуте рівноправн
|
|||
HostNotFound="Ім'я хоста, не знайдено. Переконайтеся, що ви ввели дійсний сервер трансляцій і підключення до Інтернету / DNS працює правильно."
|
||||
NoData="Ім'я хоста знайдено, але нема жодних даних вказаного типу. Це може статися, якщо ви вказали прив'язку до IPv6-адресу, але ваш сервіс трансляцій підтримує лише адреси IPv4 (див. Налаштування / Розширені)."
|
||||
AddressNotAvailable="Адреса недоступна. Напевно ви спробували прив'язатись до адаптера з неіснуючую IP-адресою (див. Налаштування / Розширені)."
|
||||
SSLCertVerifyFailed="RTMP сервер надіслав неприпустимий сертифікат SSL."
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="对方重置连接. 这通常表明你和流媒体服务之间
|
|||
HostNotFound="找不到 Hostname. 请确保您输入一个有效的流媒体服务器并且您的互联网连接 / DNS 工作正常."
|
||||
NoData="Hostname 发现, 但没有请求的类型的数据的主机名. 这有可能因为你绑定到 IPv6 地址并且你的流媒体服务仅有 IPv4 地址 (请参阅设置 / 高级)."
|
||||
AddressNotAvailable="没有可用的地址. 你可能在试图绑定到一个无效的 IP 地址 (请参阅设置 / 高级)."
|
||||
SSLCertVerifyFailed="RTMP 服务器发送了无效的 SSL 证书。"
|
||||
|
||||
|
|
|
|||
|
|
@ -11,4 +11,5 @@ ConnectionReset="連線被對方重置。通常這代表您與串流服務之間
|
|||
HostNotFound="找不到主機名稱。請確定輸入了一個有效的串流服務器且網路連線跟 DNS 工作正常。"
|
||||
NoData="找到主機名稱,但沒有要求類型的資料。這可能發生在您綁定於 IPv6 位址但串流服務只有 IPv4 位址 (請看 設定/進階)。"
|
||||
AddressNotAvailable="位址不可用。可能因為嘗試綁定到一個不正確 IP 位址(請確認 設定/進階 的設定)。"
|
||||
SSLCertVerifyFailed="RTMP 伺服器發送了一則不合法的 SSL 憑證。"
|
||||
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ static bool build_flv_meta_data(obs_output_t *context,
|
|||
enc_str(&enc, end, "onMetaData");
|
||||
|
||||
*enc++ = AMF_ECMA_ARRAY;
|
||||
enc = AMF_EncodeInt32(enc, end, a_idx == 0 ? 14 : 9);
|
||||
enc = AMF_EncodeInt32(enc, end, a_idx == 0 ? 20 : 15);
|
||||
|
||||
enc_num_val(&enc, end, "duration", 0.0);
|
||||
enc_num_val(&enc, end, "fileSize", 0.0);
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#include "bytes.h"
|
||||
|
||||
static const AMFObjectProperty AMFProp_Invalid = { {0, 0}, AMF_INVALID };
|
||||
static const AMFObject AMFObj_Invalid = { 0, 0 };
|
||||
static const AVal AV_empty = { 0, 0 };
|
||||
|
||||
/* Data is Big-Endian */
|
||||
|
|
@ -336,13 +337,19 @@ AMFProp_GetBoolean(AMFObjectProperty *prop)
|
|||
void
|
||||
AMFProp_GetString(AMFObjectProperty *prop, AVal *str)
|
||||
{
|
||||
*str = prop->p_vu.p_aval;
|
||||
if (prop->p_type == AMF_STRING)
|
||||
*str = prop->p_vu.p_aval;
|
||||
else
|
||||
*str = AV_empty;
|
||||
}
|
||||
|
||||
void
|
||||
AMFProp_GetObject(AMFObjectProperty *prop, AMFObject *obj)
|
||||
{
|
||||
*obj = prop->p_vu.p_object;
|
||||
if (prop->p_type == AMF_OBJECT)
|
||||
*obj = prop->p_vu.p_object;
|
||||
else
|
||||
*obj = AMFObj_Invalid;
|
||||
}
|
||||
|
||||
int
|
||||
|
|
@ -472,6 +479,8 @@ AMF3ReadString(const char *data, AVal *str)
|
|||
RTMP_Log(RTMP_LOGDEBUG,
|
||||
"%s, string reference, index: %d, not supported, ignoring!",
|
||||
__FUNCTION__, refIndex);
|
||||
str->av_val = NULL;
|
||||
str->av_len = 0;
|
||||
return len;
|
||||
}
|
||||
else
|
||||
|
|
@ -511,9 +520,12 @@ AMF3Prop_Decode(AMFObjectProperty *prop, const char *pBuffer, int nSize,
|
|||
if (name.av_len <= 0)
|
||||
return nRes;
|
||||
|
||||
nSize -= nRes;
|
||||
if (nSize <= 0)
|
||||
return -1;
|
||||
|
||||
prop->p_name = name;
|
||||
pBuffer += nRes;
|
||||
nSize -= nRes;
|
||||
}
|
||||
|
||||
/* decode */
|
||||
|
|
@ -601,6 +613,9 @@ AMF3Prop_Decode(AMFObjectProperty *prop, const char *pBuffer, int nSize,
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (nSize < 0)
|
||||
return -1;
|
||||
|
||||
return nOriginalSize - nSize;
|
||||
}
|
||||
|
||||
|
|
@ -994,9 +1009,18 @@ AMF_DecodeArray(AMFObject *obj, const char *pBuffer, int nSize,
|
|||
int nRes;
|
||||
nArrayLen--;
|
||||
|
||||
if (nSize <= 0)
|
||||
{
|
||||
bError = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
nRes = AMFProp_Decode(&prop, pBuffer, nSize, bDecodeName);
|
||||
if (nRes == -1)
|
||||
{
|
||||
bError = TRUE;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
nSize -= nRes;
|
||||
|
|
@ -1057,12 +1081,12 @@ AMF3_Decode(AMFObject *obj, const char *pBuffer, int nSize, int bAMFData)
|
|||
else
|
||||
{
|
||||
int32_t classExtRef = (classRef >> 1);
|
||||
int i;
|
||||
int i, cdnum;
|
||||
|
||||
cd.cd_externalizable = (classExtRef & 0x1) == 1;
|
||||
cd.cd_dynamic = ((classExtRef >> 1) & 0x1) == 1;
|
||||
|
||||
cd.cd_num = classExtRef >> 2;
|
||||
cdnum = classExtRef >> 2;
|
||||
|
||||
/* class name */
|
||||
|
||||
|
|
@ -1077,9 +1101,16 @@ AMF3_Decode(AMFObject *obj, const char *pBuffer, int nSize, int bAMFData)
|
|||
cd.cd_name.av_val, cd.cd_externalizable, cd.cd_dynamic,
|
||||
cd.cd_num);
|
||||
|
||||
for (i = 0; i < cd.cd_num; i++)
|
||||
for (i = 0; i < cdnum; i++)
|
||||
{
|
||||
AVal memberName = AV_empty;
|
||||
if (nSize <= 0)
|
||||
{
|
||||
invalid:
|
||||
RTMP_Log(RTMP_LOGDEBUG, "%s, invalid class encoding!",
|
||||
__FUNCTION__);
|
||||
return nOriginalSize;
|
||||
}
|
||||
len = AMF3ReadString(pBuffer, &memberName);
|
||||
RTMP_Log(RTMP_LOGDEBUG, "Member: %s", memberName.av_val);
|
||||
AMF3CD_AddProp(&cd, &memberName);
|
||||
|
|
@ -1115,6 +1146,8 @@ AMF3_Decode(AMFObject *obj, const char *pBuffer, int nSize, int bAMFData)
|
|||
int nRes, i;
|
||||
for (i = 0; i < cd.cd_num; i++) /* non-dynamic */
|
||||
{
|
||||
if (nSize <= 0)
|
||||
goto invalid;
|
||||
nRes = AMF3Prop_Decode(&prop, pBuffer, nSize, FALSE);
|
||||
if (nRes == -1)
|
||||
RTMP_Log(RTMP_LOGDEBUG, "%s, failed to decode AMF3 property!",
|
||||
|
|
@ -1132,6 +1165,8 @@ AMF3_Decode(AMFObject *obj, const char *pBuffer, int nSize, int bAMFData)
|
|||
|
||||
do
|
||||
{
|
||||
if (nSize <= 0)
|
||||
goto invalid;
|
||||
nRes = AMF3Prop_Decode(&prop, pBuffer, nSize, TRUE);
|
||||
AMF_AddProp(obj, &prop);
|
||||
|
||||
|
|
@ -1179,10 +1214,18 @@ AMF_Decode(AMFObject *obj, const char *pBuffer, int nSize, int bDecodeName)
|
|||
|
||||
nRes = AMFProp_Decode(&prop, pBuffer, nSize, bDecodeName);
|
||||
if (nRes == -1)
|
||||
{
|
||||
bError = TRUE;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
nSize -= nRes;
|
||||
if (nSize < 0)
|
||||
{
|
||||
bError = TRUE;
|
||||
break;
|
||||
}
|
||||
pBuffer += nRes;
|
||||
AMF_AddProp(obj, &prop);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,59 @@
|
|||
* http://www.gnu.org/copyleft/lgpl.html
|
||||
*/
|
||||
|
||||
#ifdef USE_POLARSSL
|
||||
#if defined(USE_MBEDTLS)
|
||||
#include <mbedtls/dhm.h>
|
||||
#include <mbedtls/bignum.h>
|
||||
typedef mbedtls_mpi* MP_t;
|
||||
#define MP_new(m) m = malloc(sizeof(mbedtls_mpi)); mbedtls_mpi_init(m)
|
||||
#define MP_set_w(mpi, w) mbedtls_mpi_lset(mpi, w)
|
||||
#define MP_cmp(u, v) mbedtls_mpi_cmp_mpi(u, v)
|
||||
#define MP_set(u, v) mbedtls_mpi_copy(u, v)
|
||||
#define MP_sub_w(mpi, w) mbedtls_mpi_sub_int(mpi, mpi, w)
|
||||
#define MP_cmp_1(mpi) mbedtls_mpi_cmp_int(mpi, 1)
|
||||
#define MP_modexp(r, y, q, p) mbedtls_mpi_exp_mod(r, y, q, p, NULL)
|
||||
#define MP_free(mpi) mbedtls_mpi_free(mpi); free(mpi)
|
||||
#define MP_gethex(u, hex, res) MP_new(u); res = mbedtls_mpi_read_string(u, 16, hex) == 0
|
||||
#define MP_bytes(u) mbedtls_mpi_size(u)
|
||||
#define MP_setbin(u,buf,len) mbedtls_mpi_write_binary(u,buf,len)
|
||||
#define MP_getbin(u,buf,len) MP_new(u); mbedtls_mpi_read_binary(u,buf,len)
|
||||
|
||||
typedef struct MDH
|
||||
{
|
||||
MP_t p;
|
||||
MP_t g;
|
||||
MP_t pub_key;
|
||||
MP_t priv_key;
|
||||
long length;
|
||||
mbedtls_dhm_context ctx;
|
||||
} MDH;
|
||||
|
||||
#define MDH_new() calloc(1,sizeof(MDH))
|
||||
#define MDH_free(vp) {MDH *_dh = vp; mbedtls_dhm_free(&_dh->ctx); MP_free(_dh->p); MP_free(_dh->g); MP_free(_dh->pub_key); MP_free(_dh->priv_key); free(_dh);}
|
||||
|
||||
static int MDH_generate_key(MDH *dh)
|
||||
{
|
||||
unsigned char out[2];
|
||||
MP_set(&dh->ctx.P, dh->p);
|
||||
MP_set(&dh->ctx.G, dh->g);
|
||||
dh->ctx.len = 128;
|
||||
mbedtls_dhm_make_public(&dh->ctx, 1024, out, 1, mbedtls_ctr_drbg_random, &RTMP_TLS_ctx->ctr_drbg);
|
||||
MP_new(dh->pub_key);
|
||||
MP_new(dh->priv_key);
|
||||
MP_set(dh->pub_key, &dh->ctx.GX);
|
||||
MP_set(dh->priv_key, &dh->ctx.X);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int MDH_compute_key(uint8_t *secret, size_t len, MP_t pub, MDH *dh)
|
||||
{
|
||||
MP_set(&dh->ctx.GY, pub);
|
||||
size_t olen;
|
||||
mbedtls_dhm_calc_secret(&dh->ctx, secret, len, &olen, NULL, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#elif defined(USE_POLARSSL)
|
||||
#include <polarssl/dhm.h>
|
||||
typedef mpi * MP_t;
|
||||
#define MP_new(m) m = malloc(sizeof(mpi)); mpi_init(m)
|
||||
|
|
@ -271,7 +323,7 @@ DHGetPublicKey(MDH *dh, uint8_t *pubkey, size_t nPubkeyLen)
|
|||
if (!dh || !dh->pub_key)
|
||||
return 0;
|
||||
|
||||
len = MP_bytes(dh->pub_key);
|
||||
len = (int)MP_bytes(dh->pub_key);
|
||||
if (len <= 0 || len > (int) nPubkeyLen)
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,28 @@
|
|||
|
||||
/* This file is #included in rtmp.c, it is not meant to be compiled alone */
|
||||
|
||||
#ifdef USE_POLARSSL
|
||||
#if defined(USE_MBEDTLS)
|
||||
#include <mbedtls/md.h>
|
||||
#include <mbedtls/arc4.h>
|
||||
#ifndef SHA256_DIGEST_LENGTH
|
||||
#define SHA256_DIGEST_LENGTH 32
|
||||
#endif
|
||||
typedef mbedtls_md_context_t *HMAC_CTX;
|
||||
#define HMAC_setup(ctx, key, len) ctx = malloc(sizeof(mbedtls_md_context_t)); mbedtls_md_init(ctx); \
|
||||
mbedtls_md_setup(ctx, mbedtls_md_info_from_type(MBEDTLS_MD_SHA256), 1); \
|
||||
mbedtls_md_hmac_starts(ctx, (const unsigned char *)key, len)
|
||||
#define HMAC_crunch(ctx, buf, len) mbedtls_md_hmac_update(ctx, buf, len)
|
||||
#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; mbedtls_md_hmac_finish(ctx, dig)
|
||||
#define HMAC_close(ctx) mbedtls_md_free(ctx); free(ctx); ctx = NULL
|
||||
|
||||
typedef mbedtls_arc4_context* RC4_handle;
|
||||
#define RC4_alloc(h) *h = malloc(sizeof(mbedtls_arc4_context)); mbedtls_arc4_init(*h)
|
||||
#define RC4_setkey(h,l,k) mbedtls_arc4_setup(h,k,l)
|
||||
#define RC4_encrypt(h,l,d) mbedtls_arc4_crypt(h,l,(unsigned char *)d,(unsigned char *)d)
|
||||
#define RC4_encrypt2(h,l,s,d) mbedtls_arc4_crypt(h,l,(unsigned char *)s,(unsigned char *)d)
|
||||
#define RC4_free(h) mbedtls_arc4_free(h); free(h); h = NULL
|
||||
|
||||
#elif defined(USE_POLARSSL)
|
||||
#include <polarssl/sha2.h>
|
||||
#include <polarssl/arc4.h>
|
||||
#ifndef SHA256_DIGEST_LENGTH
|
||||
|
|
@ -148,6 +169,8 @@ typedef unsigned int (getoff)(uint8_t *buf, unsigned int len);
|
|||
static unsigned int
|
||||
GetDHOffset2(uint8_t *handshake, unsigned int len)
|
||||
{
|
||||
(void) len;
|
||||
|
||||
unsigned int offset = 0;
|
||||
uint8_t *ptr = handshake + 768;
|
||||
unsigned int res;
|
||||
|
|
@ -177,6 +200,8 @@ GetDHOffset2(uint8_t *handshake, unsigned int len)
|
|||
static unsigned int
|
||||
GetDigestOffset2(uint8_t *handshake, unsigned int len)
|
||||
{
|
||||
(void) len;
|
||||
|
||||
unsigned int offset = 0;
|
||||
uint8_t *ptr = handshake + 772;
|
||||
unsigned int res;
|
||||
|
|
@ -206,6 +231,8 @@ GetDigestOffset2(uint8_t *handshake, unsigned int len)
|
|||
static unsigned int
|
||||
GetDHOffset1(uint8_t *handshake, unsigned int len)
|
||||
{
|
||||
(void) len;
|
||||
|
||||
unsigned int offset = 0;
|
||||
uint8_t *ptr = handshake + 1532;
|
||||
unsigned int res;
|
||||
|
|
@ -235,6 +262,8 @@ GetDHOffset1(uint8_t *handshake, unsigned int len)
|
|||
static unsigned int
|
||||
GetDigestOffset1(uint8_t *handshake, unsigned int len)
|
||||
{
|
||||
(void) len;
|
||||
|
||||
unsigned int offset = 0;
|
||||
uint8_t *ptr = handshake + 8;
|
||||
unsigned int res;
|
||||
|
|
@ -1128,6 +1157,7 @@ HandShake(RTMP * r, int FP9HandShake)
|
|||
__FUNCTION__);
|
||||
}
|
||||
}
|
||||
// TODO(mgoulet): Should this have a HMAC_finish here?
|
||||
|
||||
RTMP_Log(RTMP_LOGDEBUG, "%s: Handshaking finished....", __FUNCTION__);
|
||||
return TRUE;
|
||||
|
|
@ -1482,6 +1512,8 @@ SHandShake(RTMP * r)
|
|||
}
|
||||
}
|
||||
|
||||
// TODO(mgoulet): Should this have an Rc4_free?
|
||||
|
||||
RTMP_Log(RTMP_LOGDEBUG, "%s: Handshaking finished....", __FUNCTION__);
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,7 +30,20 @@
|
|||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
#endif
|
||||
|
||||
#ifdef USE_POLARSSL
|
||||
#if defined(USE_MBEDTLS)
|
||||
#include <mbedtls/md.h>
|
||||
#ifndef SHA256_DIGEST_LENGTH
|
||||
#define SHA256_DIGEST_LENGTH 32
|
||||
#endif
|
||||
typedef mbedtls_md_context_t *HMAC_CTX;
|
||||
#define HMAC_setup(ctx, key, len) ctx = malloc(sizeof(mbedtls_md_context_t)); mbedtls_md_init(ctx); \
|
||||
mbedtls_md_setup(ctx, mbedtls_md_info_from_type(MBEDTLS_MD_SHA256), 1); \
|
||||
mbedtls_md_hmac_starts(ctx, (const unsigned char *)key, len)
|
||||
#define HMAC_crunch(ctx, buf, len) mbedtls_md_hmac_update(ctx, buf, len)
|
||||
#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; mbedtls_md_hmac_finish(ctx, dig)
|
||||
#define HMAC_close(ctx) free(ctx); mbedtls_md_free(ctx); ctx = NULL
|
||||
|
||||
#elif defined(USE_POLARSSL)
|
||||
#include <polarssl/sha2.h>
|
||||
#ifndef SHA256_DIGEST_LENGTH
|
||||
#define SHA256_DIGEST_LENGTH 32
|
||||
|
|
@ -40,6 +53,7 @@
|
|||
#define HMAC_crunch(ctx, buf, len) sha2_hmac_update(&ctx, buf, len)
|
||||
#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; sha2_hmac_finish(&ctx, dig)
|
||||
#define HMAC_close(ctx)
|
||||
|
||||
#elif defined(USE_GNUTLS)
|
||||
#include <nettle/hmac.h>
|
||||
#ifndef SHA256_DIGEST_LENGTH
|
||||
|
|
@ -51,6 +65,7 @@
|
|||
#define HMAC_crunch(ctx, buf, len) hmac_sha256_update(&ctx, len, buf)
|
||||
#define HMAC_finish(ctx, dig, dlen) dlen = SHA256_DIGEST_LENGTH; hmac_sha256_digest(&ctx, SHA256_DIGEST_LENGTH, dig)
|
||||
#define HMAC_close(ctx)
|
||||
|
||||
#else /* USE_OPENSSL */
|
||||
#include <openssl/ssl.h>
|
||||
#include <openssl/sha.h>
|
||||
|
|
@ -161,8 +176,17 @@ HTTP_get(struct HTTP_ctx *http, const char *url, HTTP_read_callback *cb)
|
|||
goto leave;
|
||||
#else
|
||||
TLS_client(RTMP_TLS_ctx, sb.sb_ssl);
|
||||
|
||||
#if defined(USE_MBEDTLS)
|
||||
mbedtls_net_context *server_fd = &RTMP_TLS_ctx->net;
|
||||
server_fd->fd = sb.sb_socket;
|
||||
TLS_setfd(sb.sb_ssl, server_fd);
|
||||
#else
|
||||
TLS_setfd(sb.sb_ssl, sb.sb_socket);
|
||||
if (TLS_connect(sb.sb_ssl) < 0)
|
||||
#endif
|
||||
|
||||
int connect_return = TLS_connect(sb.sb_ssl);
|
||||
if (connect_return < 0)
|
||||
{
|
||||
RTMP_Log(RTMP_LOGERROR, "%s, TLS_Connect failed", __FUNCTION__);
|
||||
ret = HTTPRES_LOST_CONNECTION;
|
||||
|
|
@ -318,21 +342,21 @@ swfcrunch(void *ptr, size_t size, size_t nmemb, void *stream)
|
|||
{
|
||||
unsigned char out[CHUNK];
|
||||
i->zs->next_in = (unsigned char *)p;
|
||||
i->zs->avail_in = len;
|
||||
i->zs->avail_in = (uInt)len;
|
||||
do
|
||||
{
|
||||
i->zs->avail_out = CHUNK;
|
||||
i->zs->next_out = out;
|
||||
inflate(i->zs, Z_NO_FLUSH);
|
||||
len = CHUNK - i->zs->avail_out;
|
||||
i->size += len;
|
||||
i->size += (int)len;
|
||||
HMAC_crunch(i->ctx, out, len);
|
||||
}
|
||||
while (i->zs->avail_out == 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
i->size += len;
|
||||
i->size += (int)len;
|
||||
HMAC_crunch(i->ctx, (unsigned char *)p, len);
|
||||
}
|
||||
return size * nmemb;
|
||||
|
|
@ -469,7 +493,7 @@ RTMP_HashSWF(const char *url, unsigned int *size, unsigned char *hash,
|
|||
home.av_val = "\\UserData";
|
||||
#else
|
||||
hpre.av_val = getenv("HOMEDRIVE");
|
||||
hpre.av_len = strlen(hpre.av_val);
|
||||
hpre.av_len = (int)strlen(hpre.av_val);
|
||||
home.av_val = getenv("HOMEPATH");
|
||||
#endif
|
||||
#define DIRSEP "\\"
|
||||
|
|
@ -482,7 +506,7 @@ RTMP_HashSWF(const char *url, unsigned int *size, unsigned char *hash,
|
|||
#endif
|
||||
if (!home.av_val)
|
||||
home.av_val = ".";
|
||||
home.av_len = strlen(home.av_val);
|
||||
home.av_len = (int)strlen(home.av_val);
|
||||
|
||||
/* SWF hash info is cached in a fixed-format file.
|
||||
* url: <url of SWF file>
|
||||
|
|
@ -528,7 +552,7 @@ RTMP_HashSWF(const char *url, unsigned int *size, unsigned char *hash,
|
|||
if (strncmp(buf + 5, url, hlen))
|
||||
continue;
|
||||
r1 = strrchr(buf, '/');
|
||||
i = strlen(r1);
|
||||
i = (int)strlen(r1);
|
||||
r1[--i] = '\0';
|
||||
if (strncmp(r1, file, i))
|
||||
continue;
|
||||
|
|
@ -543,7 +567,7 @@ RTMP_HashSWF(const char *url, unsigned int *size, unsigned char *hash,
|
|||
else if (!strncmp(buf, "hash: ", 6))
|
||||
{
|
||||
unsigned char *ptr = hash, *in = (unsigned char *)buf + 6;
|
||||
int l = strlen((char *)in) - 1;
|
||||
int l = (int)strlen((char *)in) - 1;
|
||||
for (i = 0; i < l; i += 2)
|
||||
*ptr++ = (HEX2BIN(in[i]) << 4) | HEX2BIN(in[i + 1]);
|
||||
got++;
|
||||
|
|
@ -625,7 +649,7 @@ RTMP_HashSWF(const char *url, unsigned int *size, unsigned char *hash,
|
|||
if (q)
|
||||
i = q - url;
|
||||
else
|
||||
i = strlen(url);
|
||||
i = (int)strlen(url);
|
||||
|
||||
fprintf(f, "url: %.*s\n", i, url);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,7 +40,20 @@
|
|||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
#endif
|
||||
|
||||
#ifdef USE_POLARSSL
|
||||
#if defined(USE_MBEDTLS)
|
||||
#if defined(_WIN32)
|
||||
#include <windows.h>
|
||||
#include <wincrypt.h>
|
||||
#elif defined(__APPLE__)
|
||||
#include <Security/Security.h>
|
||||
#endif
|
||||
|
||||
#include <mbedtls/ctr_drbg.h>
|
||||
#include <mbedtls/md5.h>
|
||||
#include <mbedtls/base64.h>
|
||||
#define MD5_DIGEST_LENGTH 16
|
||||
|
||||
#elif defined(USE_POLARSSL)
|
||||
#include <polarssl/havege.h>
|
||||
#include <polarssl/md5.h>
|
||||
#include <polarssl/base64.h>
|
||||
|
|
@ -57,7 +70,6 @@ static const char *my_dhm_P =
|
|||
"E8A700D60B7F1200FA8E77B0A979DABF";
|
||||
|
||||
static const char *my_dhm_G = "4";
|
||||
|
||||
#elif defined(USE_GNUTLS)
|
||||
#include <gnutls/gnutls.h>
|
||||
#define MD5_DIGEST_LENGTH 16
|
||||
|
|
@ -70,7 +82,8 @@ static const char *my_dhm_G = "4";
|
|||
#include <openssl/bio.h>
|
||||
#include <openssl/buffer.h>
|
||||
#endif
|
||||
TLS_CTX RTMP_TLS_ctx;
|
||||
|
||||
TLS_CTX RTMP_TLS_ctx = NULL;
|
||||
#endif
|
||||
|
||||
#define RTMP_SIG_SIZE 1536
|
||||
|
|
@ -226,9 +239,13 @@ RTMPPacket_Reset(RTMPPacket *p)
|
|||
}
|
||||
|
||||
int
|
||||
RTMPPacket_Alloc(RTMPPacket *p, int nSize)
|
||||
RTMPPacket_Alloc(RTMPPacket *p, uint32_t nSize)
|
||||
{
|
||||
char *ptr = calloc(1, nSize + RTMP_MAX_HEADER_SIZE);
|
||||
char *ptr;
|
||||
if (nSize > SIZE_MAX - RTMP_MAX_HEADER_SIZE)
|
||||
return FALSE;
|
||||
|
||||
ptr = calloc(1, nSize + RTMP_MAX_HEADER_SIZE);
|
||||
if (!ptr)
|
||||
return FALSE;
|
||||
p->m_body = ptr + RTMP_MAX_HEADER_SIZE;
|
||||
|
|
@ -261,11 +278,101 @@ RTMP_LibVersion()
|
|||
return RTMP_LIB_VERSION;
|
||||
}
|
||||
|
||||
void
|
||||
RTMP_TLS_LoadCerts() {
|
||||
#ifdef USE_MBEDTLS
|
||||
mbedtls_x509_crt *chain = RTMP_TLS_ctx->cacert = calloc(1, sizeof(struct mbedtls_x509_crt));
|
||||
mbedtls_x509_crt_init(chain);
|
||||
|
||||
#if defined(_WIN32)
|
||||
HCERTSTORE hCertStore;
|
||||
PCCERT_CONTEXT pCertContext = NULL;
|
||||
|
||||
if (!(hCertStore = CertOpenSystemStore((HCRYPTPROV)NULL, L"ROOT"))) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
while (pCertContext = CertEnumCertificatesInStore(hCertStore, pCertContext)) {
|
||||
mbedtls_x509_crt_parse_der(chain,
|
||||
(unsigned char *)pCertContext->pbCertEncoded,
|
||||
pCertContext->cbCertEncoded);
|
||||
}
|
||||
|
||||
CertFreeCertificateContext(pCertContext);
|
||||
CertCloseStore(hCertStore, 0);
|
||||
#elif defined(__APPLE__)
|
||||
SecKeychainRef keychain_ref;
|
||||
CFMutableDictionaryRef search_settings_ref;
|
||||
CFArrayRef result_ref;
|
||||
|
||||
if (SecKeychainOpen("/System/Library/Keychains/SystemRootCertificates.keychain",
|
||||
&keychain_ref)
|
||||
!= errSecSuccess) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
search_settings_ref = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
|
||||
CFDictionarySetValue(search_settings_ref, kSecClass, kSecClassCertificate);
|
||||
CFDictionarySetValue(search_settings_ref, kSecMatchLimit, kSecMatchLimitAll);
|
||||
CFDictionarySetValue(search_settings_ref, kSecReturnRef, kCFBooleanTrue);
|
||||
CFDictionarySetValue(search_settings_ref, kSecMatchSearchList,
|
||||
CFArrayCreate(NULL, (const void **)&keychain_ref, 1, NULL));
|
||||
|
||||
if (SecItemCopyMatching(search_settings_ref, (CFTypeRef *)&result_ref)
|
||||
!= errSecSuccess) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
for (CFIndex i = 0; i < CFArrayGetCount(result_ref); i++) {
|
||||
SecCertificateRef item_ref = (SecCertificateRef)
|
||||
CFArrayGetValueAtIndex(result_ref, i);
|
||||
CFDataRef data_ref;
|
||||
|
||||
if ((data_ref = SecCertificateCopyData(item_ref))) {
|
||||
mbedtls_x509_crt_parse_der(chain,
|
||||
(unsigned char *)CFDataGetBytePtr(data_ref),
|
||||
CFDataGetLength(data_ref));
|
||||
CFRelease(data_ref);
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease(keychain_ref);
|
||||
#elif defined(__linux__)
|
||||
if (mbedtls_x509_crt_parse_path(chain, "/etc/ssl/certs/") != 0) {
|
||||
goto error;
|
||||
}
|
||||
#endif
|
||||
|
||||
mbedtls_ssl_conf_ca_chain(&RTMP_TLS_ctx->conf, chain, NULL);
|
||||
return;
|
||||
|
||||
error:
|
||||
mbedtls_x509_crt_free(chain);
|
||||
free(chain);
|
||||
RTMP_TLS_ctx->cacert = NULL;
|
||||
#endif /* USE_MBEDTLS */
|
||||
}
|
||||
|
||||
void
|
||||
RTMP_TLS_Init()
|
||||
{
|
||||
#ifdef CRYPTO
|
||||
#ifdef USE_POLARSSL
|
||||
#if defined(USE_MBEDTLS)
|
||||
const char * pers = "RTMP_TLS";
|
||||
RTMP_TLS_ctx = calloc(1,sizeof(struct tls_ctx));
|
||||
|
||||
mbedtls_ssl_config_init(&RTMP_TLS_ctx->conf);
|
||||
mbedtls_ctr_drbg_init(&RTMP_TLS_ctx->ctr_drbg);
|
||||
mbedtls_entropy_init(&RTMP_TLS_ctx->entropy);
|
||||
|
||||
mbedtls_ctr_drbg_seed(&RTMP_TLS_ctx->ctr_drbg,
|
||||
mbedtls_entropy_func,
|
||||
&RTMP_TLS_ctx->entropy,
|
||||
(const unsigned char *)pers,
|
||||
strlen(pers));
|
||||
|
||||
RTMP_TLS_LoadCerts();
|
||||
#elif defined(USE_POLARSSL)
|
||||
/* Do this regardless of NO_SSL, we use havege for rtmpe too */
|
||||
RTMP_TLS_ctx = calloc(1,sizeof(struct tls_ctx));
|
||||
havege_init(&RTMP_TLS_ctx->hs);
|
||||
|
|
@ -289,6 +396,26 @@ RTMP_TLS_Init()
|
|||
SSL_CTX_set_options(RTMP_TLS_ctx, SSL_OP_ALL);
|
||||
SSL_CTX_set_default_verify_paths(RTMP_TLS_ctx);
|
||||
#endif
|
||||
#else
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
RTMP_TLS_Free() {
|
||||
#ifdef USE_MBEDTLS
|
||||
mbedtls_ssl_config_free(&RTMP_TLS_ctx->conf);
|
||||
mbedtls_ctr_drbg_free(&RTMP_TLS_ctx->ctr_drbg);
|
||||
mbedtls_entropy_free(&RTMP_TLS_ctx->entropy);
|
||||
|
||||
if (RTMP_TLS_ctx->cacert) {
|
||||
mbedtls_x509_crt_free(RTMP_TLS_ctx->cacert);
|
||||
free(RTMP_TLS_ctx->cacert);
|
||||
RTMP_TLS_ctx->cacert = NULL;
|
||||
}
|
||||
|
||||
// NO mbedtls_net_free() BECAUSE WE SET IT UP BY HAND!
|
||||
free(RTMP_TLS_ctx);
|
||||
RTMP_TLS_ctx = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -299,7 +426,27 @@ RTMP_TLS_AllocServerContext(const char* cert, const char* key)
|
|||
#ifdef CRYPTO
|
||||
if (!RTMP_TLS_ctx)
|
||||
RTMP_TLS_Init();
|
||||
#ifdef USE_POLARSSL
|
||||
#if defined(USE_MBEDTLS)
|
||||
tls_server_ctx *tc = ctx = calloc(1, sizeof(struct tls_server_ctx));
|
||||
tc->conf = &RTMP_TLS_ctx->conf;
|
||||
tc->ctr_drbg = &RTMP_TLS_ctx->ctr_drbg;
|
||||
|
||||
mbedtls_x509_crt_init(&tc->cert);
|
||||
if (mbedtls_x509_crt_parse_file(&tc->cert, cert))
|
||||
{
|
||||
free(tc);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mbedtls_pk_init(&tc->key);
|
||||
if (mbedtls_pk_parse_keyfile(&tc->key, key, NULL))
|
||||
{
|
||||
mbedtls_x509_crt_free(&tc->cert);
|
||||
mbedtls_pk_free(&tc->key);
|
||||
free(tc);
|
||||
return NULL;
|
||||
}
|
||||
#elif defined(USE_POLARSSL)
|
||||
tls_server_ctx *tc = ctx = calloc(1, sizeof(struct tls_server_ctx));
|
||||
tc->dhm_P = my_dhm_P;
|
||||
tc->dhm_G = my_dhm_G;
|
||||
|
|
@ -346,7 +493,11 @@ void
|
|||
RTMP_TLS_FreeServerContext(void *ctx)
|
||||
{
|
||||
#ifdef CRYPTO
|
||||
#ifdef USE_POLARSSL
|
||||
#if defined(USE_MBEDTLS)
|
||||
mbedtls_x509_crt_free(&((tls_server_ctx*)ctx)->cert);
|
||||
mbedtls_pk_free(&((tls_server_ctx*)ctx)->key);
|
||||
free(ctx);
|
||||
#elif defined(USE_POLARSSL)
|
||||
x509_free(&((tls_server_ctx*)ctx)->cert);
|
||||
rsa_free(&((tls_server_ctx*)ctx)->key);
|
||||
free(ctx);
|
||||
|
|
@ -370,6 +521,10 @@ RTMP_Alloc()
|
|||
void
|
||||
RTMP_Free(RTMP *r)
|
||||
{
|
||||
#if defined(CRYPTO) && defined(USE_MBEDTLS)
|
||||
if (RTMP_TLS_ctx)
|
||||
RTMP_TLS_Free();
|
||||
#endif
|
||||
free(r);
|
||||
}
|
||||
|
||||
|
|
@ -846,9 +1001,20 @@ int
|
|||
RTMP_TLS_Accept(RTMP *r, void *ctx)
|
||||
{
|
||||
#if defined(CRYPTO) && !defined(NO_SSL)
|
||||
TLS_server(ctx, r->m_sb.sb_ssl);
|
||||
tls_server_ctx *srv_ctx = ctx;
|
||||
TLS_server(srv_ctx, r->m_sb.sb_ssl);
|
||||
|
||||
#if defined(USE_MBEDTLS)
|
||||
mbedtls_net_context *client_fd = &RTMP_TLS_ctx->net;
|
||||
mbedtls_net_init(client_fd);
|
||||
client_fd->fd = r->m_sb.sb_socket;
|
||||
TLS_setfd(r->m_sb.sb_ssl, client_fd);
|
||||
#else
|
||||
TLS_setfd(r->m_sb.sb_ssl, r->m_sb.sb_socket);
|
||||
if (TLS_accept(r->m_sb.sb_ssl) < 0)
|
||||
#endif
|
||||
|
||||
int connect_return = TLS_connect(r->m_sb.sb_ssl);
|
||||
if (connect_return < 0)
|
||||
{
|
||||
RTMP_Log(RTMP_LOGERROR, "%s, TLS_Connect failed", __FUNCTION__);
|
||||
return FALSE;
|
||||
|
|
@ -868,10 +1034,59 @@ RTMP_Connect1(RTMP *r, RTMPPacket *cp)
|
|||
{
|
||||
#if defined(CRYPTO) && !defined(NO_SSL)
|
||||
TLS_client(RTMP_TLS_ctx, r->m_sb.sb_ssl);
|
||||
|
||||
#if defined(USE_MBEDTLS)
|
||||
mbedtls_net_context *server_fd = &RTMP_TLS_ctx->net;
|
||||
server_fd->fd = r->m_sb.sb_socket;
|
||||
TLS_setfd(r->m_sb.sb_ssl, server_fd);
|
||||
|
||||
// make sure we verify the certificate hostname
|
||||
char hostname[MBEDTLS_SSL_MAX_HOST_NAME_LEN + 1];
|
||||
|
||||
if (r->Link.hostname.av_len >= MBEDTLS_SSL_MAX_HOST_NAME_LEN)
|
||||
return FALSE;
|
||||
|
||||
memcpy(hostname, r->Link.hostname.av_val, r->Link.hostname.av_len);
|
||||
hostname[r->Link.hostname.av_len] = 0;
|
||||
|
||||
if (mbedtls_ssl_set_hostname(r->m_sb.sb_ssl, hostname))
|
||||
return FALSE;
|
||||
#else
|
||||
TLS_setfd(r->m_sb.sb_ssl, r->m_sb.sb_socket);
|
||||
if (TLS_connect(r->m_sb.sb_ssl) < 0)
|
||||
#endif
|
||||
|
||||
int connect_return = TLS_connect(r->m_sb.sb_ssl);
|
||||
if (connect_return < 0)
|
||||
{
|
||||
RTMP_Log(RTMP_LOGERROR, "%s, TLS_Connect failed", __FUNCTION__);
|
||||
#if defined(USE_MBEDTLS)
|
||||
if (connect_return == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED)
|
||||
{
|
||||
r->last_error_code = connect_return;
|
||||
|
||||
// show a more detailed error in the log if possible
|
||||
int verify_result = mbedtls_ssl_get_verify_result(r->m_sb.sb_ssl);
|
||||
if (verify_result)
|
||||
{
|
||||
char err[256], *e;
|
||||
if (mbedtls_x509_crt_verify_info(err, sizeof(err), "", verify_result) > 0)
|
||||
{
|
||||
e = strchr(err, '\n');
|
||||
if (e)
|
||||
*e = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(err, "unknown error");
|
||||
}
|
||||
RTMP_Log(RTMP_LOGERROR, "%s, Cert verify failed: %d (%s)", __FUNCTION__, verify_result, err);
|
||||
RTMP_Close(r);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
// output the error in a format that matches mbedTLS
|
||||
connect_return = abs(connect_return);
|
||||
RTMP_Log(RTMP_LOGERROR, "%s, TLS_Connect failed: -0x%x", __FUNCTION__, connect_return);
|
||||
RTMP_Close(r);
|
||||
return FALSE;
|
||||
}
|
||||
|
|
@ -879,7 +1094,6 @@ RTMP_Connect1(RTMP *r, RTMPPacket *cp)
|
|||
RTMP_Log(RTMP_LOGERROR, "%s, no SSL/TLS support", __FUNCTION__);
|
||||
RTMP_Close(r);
|
||||
return FALSE;
|
||||
|
||||
#endif
|
||||
}
|
||||
if (r->Link.protocol & RTMP_FEATURE_HTTP)
|
||||
|
|
@ -1108,7 +1322,7 @@ RTMP_GetNextMediaPacket(RTMP *r, RTMPPacket *packet)
|
|||
while (!bHasMediaPacket && RTMP_IsConnected(r)
|
||||
&& RTMP_ReadPacket(r, packet))
|
||||
{
|
||||
if (!RTMPPacket_IsReady(packet))
|
||||
if (!RTMPPacket_IsReady(packet) || !packet->m_nBodySize)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
|
@ -2398,7 +2612,19 @@ b64enc(const unsigned char *input, int length, char *output, int maxsize)
|
|||
{
|
||||
(void)maxsize;
|
||||
|
||||
#ifdef USE_POLARSSL
|
||||
#if defined(USE_MBEDTLS)
|
||||
size_t osize;
|
||||
if(mbedtls_base64_encode((unsigned char *) output, maxsize, &osize, input, length) == 0)
|
||||
{
|
||||
output[osize] = '\0';
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_Log(RTMP_LOGDEBUG, "%s, error", __FUNCTION__);
|
||||
return 0;
|
||||
}
|
||||
#elif defined(USE_POLARSSL)
|
||||
size_t buf_size = maxsize;
|
||||
if(base64_encode((unsigned char *) output, &buf_size, input, length) == 0)
|
||||
{
|
||||
|
|
@ -2457,7 +2683,13 @@ b64enc(const unsigned char *input, int length, char *output, int maxsize)
|
|||
return 1;
|
||||
}
|
||||
|
||||
#ifdef USE_POLARSSL
|
||||
#if defined(USE_MBEDTLS)
|
||||
typedef mbedtls_md5_context MD5_CTX;
|
||||
#define MD5_Init(ctx) mbedtls_md5_init(ctx); mbedtls_md5_starts(ctx)
|
||||
#define MD5_Update(ctx,data,len) mbedtls_md5_update(ctx,(unsigned char *)data,len)
|
||||
#define MD5_Final(dig,ctx) mbedtls_md5_finish(ctx,dig); mbedtls_md5_free(ctx)
|
||||
|
||||
#elif defined(USE_POLARSSL)
|
||||
#define MD5_CTX md5_context
|
||||
#define MD5_Init(ctx) md5_starts(ctx)
|
||||
#define MD5_Update(ctx,data,len) md5_update(ctx,(unsigned char *)data,len)
|
||||
|
|
@ -3713,7 +3945,6 @@ RTMP_ReadPacket(RTMP *r, RTMPPacket *packet)
|
|||
{
|
||||
packet->m_nBodySize = AMF_DecodeInt24(header + 3);
|
||||
packet->m_nBytesRead = 0;
|
||||
RTMPPacket_Free(packet);
|
||||
|
||||
if (nSize > 6)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@ extern "C"
|
|||
|
||||
void RTMPPacket_Reset(RTMPPacket *p);
|
||||
void RTMPPacket_Dump(RTMPPacket *p);
|
||||
int RTMPPacket_Alloc(RTMPPacket *p, int nSize);
|
||||
int RTMPPacket_Alloc(RTMPPacket *p, uint32_t nSize);
|
||||
void RTMPPacket_Free(RTMPPacket *p);
|
||||
|
||||
#define RTMPPacket_IsReady(a) ((a)->m_nBytesRead == (a)->m_nBodySize)
|
||||
|
|
|
|||
|
|
@ -80,7 +80,76 @@
|
|||
|
||||
#include "rtmp.h"
|
||||
|
||||
#ifdef USE_POLARSSL
|
||||
#if defined(USE_MBEDTLS)
|
||||
#include <mbedtls/version.h>
|
||||
#include <mbedtls/net.h>
|
||||
#include <mbedtls/ssl.h>
|
||||
#include <mbedtls/ctr_drbg.h>
|
||||
#include <mbedtls/entropy.h>
|
||||
|
||||
#define my_dhm_P \
|
||||
"E4004C1F94182000103D883A448B3F80" \
|
||||
"2CE4B44A83301270002C20D0321CFD00" \
|
||||
"11CCEF784C26A400F43DFB901BCA7538" \
|
||||
"F2C6B176001CF5A0FD16D2C48B1D0C1C" \
|
||||
"F6AC8E1DA6BCC3B4E1F96B0564965300" \
|
||||
"FFA1D0B601EB2800F489AA512C4B248C" \
|
||||
"01F76949A60BB7F00A40B1EAB64BDD48" \
|
||||
"E8A700D60B7F1200FA8E77B0A979DABF"
|
||||
|
||||
#define my_dhm_G "4"
|
||||
|
||||
#define SSL_SET_SESSION(S,resume,timeout,ctx) mbedtls_ssl_set_session(S,ctx)
|
||||
|
||||
typedef struct tls_ctx
|
||||
{
|
||||
mbedtls_entropy_context entropy;
|
||||
mbedtls_ctr_drbg_context ctr_drbg;
|
||||
mbedtls_ssl_config conf;
|
||||
mbedtls_ssl_session ssn;
|
||||
mbedtls_x509_crt *cacert;
|
||||
mbedtls_net_context net;
|
||||
} tls_ctx;
|
||||
|
||||
typedef struct tls_server_ctx
|
||||
{
|
||||
mbedtls_ssl_config *conf;
|
||||
mbedtls_ctr_drbg_context *ctr_drbg;
|
||||
mbedtls_pk_context key;
|
||||
mbedtls_x509_crt cert;
|
||||
} tls_server_ctx;
|
||||
|
||||
typedef tls_ctx *TLS_CTX;
|
||||
|
||||
#define TLS_client(ctx,s) \
|
||||
s = malloc(sizeof(mbedtls_ssl_context));\
|
||||
mbedtls_ssl_init(s);\
|
||||
mbedtls_ssl_setup(s, &ctx->conf);\
|
||||
mbedtls_ssl_config_defaults(&ctx->conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT);\
|
||||
mbedtls_ssl_conf_authmode(&ctx->conf, MBEDTLS_SSL_VERIFY_REQUIRED);\
|
||||
mbedtls_ssl_conf_rng(&ctx->conf, mbedtls_ctr_drbg_random, &ctx->ctr_drbg)
|
||||
|
||||
#define TLS_server(ctx,s)\
|
||||
s = malloc(sizeof(mbedtls_ssl_context));\
|
||||
mbedtls_ssl_init(s);\
|
||||
mbedtls_ssl_setup(s, ctx->conf);\
|
||||
mbedtls_ssl_conf_endpoint(ctx->conf, MBEDTLS_SSL_IS_SERVER);\
|
||||
mbedtls_ssl_conf_authmode(ctx->conf, MBEDTLS_SSL_VERIFY_REQUIRED);\
|
||||
mbedtls_ssl_conf_rng(ctx->conf, mbedtls_ctr_drbg_random, ctx->ctr_drbg);\
|
||||
mbedtls_ssl_conf_own_cert(ctx->conf, &ctx->cert, &ctx->key);\
|
||||
mbedtls_ssl_conf_dh_param_bin(ctx->conf,\
|
||||
(const unsigned char *)my_dhm_P, strlen(my_dhm_P),\
|
||||
(const unsigned char *)my_dhm_G, strlen(my_dhm_G))
|
||||
|
||||
#define TLS_setfd(s,fd) mbedtls_ssl_set_bio(s, fd, mbedtls_net_send, mbedtls_net_recv, NULL)
|
||||
#define TLS_connect(s) mbedtls_ssl_handshake(s)
|
||||
#define TLS_accept(s) mbedtls_ssl_handshake(s)
|
||||
#define TLS_read(s,b,l) mbedtls_ssl_read(s,(unsigned char *)b,l)
|
||||
#define TLS_write(s,b,l) mbedtls_ssl_write(s,(unsigned char *)b,l)
|
||||
#define TLS_shutdown(s) mbedtls_ssl_close_notify(s)
|
||||
#define TLS_close(s) mbedtls_ssl_free(s); free(s)
|
||||
|
||||
#elif defined(USE_POLARSSL)
|
||||
#include <polarssl/version.h>
|
||||
#include <polarssl/net.h>
|
||||
#include <polarssl/ssl.h>
|
||||
|
|
@ -128,6 +197,7 @@ typedef struct tls_server_ctx
|
|||
#define TLS_shutdown(s) ssl_close_notify(s)
|
||||
#define TLS_close(s) ssl_free(s); free(s)
|
||||
|
||||
|
||||
#elif defined(USE_GNUTLS)
|
||||
#include <gnutls/gnutls.h>
|
||||
typedef struct tls_ctx
|
||||
|
|
|
|||
|
|
@ -438,6 +438,15 @@ static void set_output_error(struct rtmp_stream *stream)
|
|||
}
|
||||
#endif
|
||||
|
||||
// non platform-specific errors
|
||||
if (!msg) {
|
||||
switch (stream->rtmp.last_error_code) {
|
||||
case -0x2700:
|
||||
msg = obs_module_text("SSLCertVerifyFailed");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
obs_output_set_last_error(stream->output, msg);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -169,13 +169,13 @@ static enum data_ret write_data(struct rtmp_stream *stream, bool *can_write,
|
|||
size_t send_len =
|
||||
min(latency_packet_size, stream->write_buf_len);
|
||||
|
||||
ret = send(stream->rtmp.m_sb.sb_socket,
|
||||
ret = RTMPSockBuf_Send(&stream->rtmp.m_sb,
|
||||
(const char *)stream->write_buf,
|
||||
(int)send_len, 0);
|
||||
(int)send_len);
|
||||
} else {
|
||||
ret = send(stream->rtmp.m_sb.sb_socket,
|
||||
ret = RTMPSockBuf_Send(&stream->rtmp.m_sb,
|
||||
(const char *)stream->write_buf,
|
||||
(int)stream->write_buf_len, 0);
|
||||
(int)stream->write_buf_len);
|
||||
}
|
||||
|
||||
if (ret > 0) {
|
||||
|
|
|
|||
|
|
@ -7,6 +7,12 @@ Filter.TextFiles="Αρχεία κειμένου"
|
|||
Filter.AllFiles="Όλα τα αρχεία"
|
||||
Color="Χρώμα"
|
||||
Opacity="Αδιαφάνεια"
|
||||
Gradient="Κλίση"
|
||||
Gradient.Color="Χρώμα κλίσης"
|
||||
Gradient.Opacity="Αδιαφάνεια κλίσης"
|
||||
Gradient.Direction="Κατεύθυνση διαβάθμισης"
|
||||
BkColor="Χρώμα Φόντου"
|
||||
BkOpacity="Αδιαφάνεια Φόντου"
|
||||
Alignment="Στοίχιση"
|
||||
Alignment.Left="Αριστερά"
|
||||
Alignment.Center="Κέντρο"
|
||||
|
|
@ -16,4 +22,13 @@ VerticalAlignment="Κατακόρυφη Στοίχιση"
|
|||
VerticalAlignment.Top="Πάνω"
|
||||
VerticalAlignment.Bottom="Κάτω"
|
||||
Outline="Περίγραμμα"
|
||||
Outline.Size="Μέγεθος περιγράμματος"
|
||||
Outline.Color="Χρώμα Περιγράμματος"
|
||||
Outline.Opacity="Αδιαφάνεια περιγράμματος"
|
||||
ChatlogMode="Λειτουργία αρχείοz καταγραφής συνομιλίας"
|
||||
ChatlogMode.Lines="Όριο καταγραφής συνομιλίας"
|
||||
UseCustomExtents="Χρήση Προσαρμοσμένων Επεκτάσεων Κειμένου"
|
||||
UseCustomExtents.Wrap="Αναδίπλωση"
|
||||
Width="Πλάτος"
|
||||
Height="Ύψος"
|
||||
|
||||
|
|
|
|||
20
plugins/obs-text/data/locale/gd-GB.ini
Normal file
20
plugins/obs-text/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
Font="Cruth-clò"
|
||||
Text="Teacsa"
|
||||
Filter.TextFiles="Faidhlichean teacsa"
|
||||
Filter.AllFiles="A h-uile faidhle"
|
||||
Color="Dath"
|
||||
Gradient="Caisead"
|
||||
BkColor="Dath a’ chùlaibh"
|
||||
Alignment="Co-thaobhadh"
|
||||
Alignment.Left="Gu clì"
|
||||
Alignment.Center="Sa mheadhan"
|
||||
Alignment.Right="Gu deas"
|
||||
Vertical="Inghearach"
|
||||
VerticalAlignment="Co-thaobhadh inghearach"
|
||||
VerticalAlignment.Top="Barr"
|
||||
VerticalAlignment.Bottom="Bonn"
|
||||
Outline="Oir-loidhne"
|
||||
UseCustomExtents.Wrap="Paisg"
|
||||
Width="Leud"
|
||||
Height="Àirde"
|
||||
|
||||
34
plugins/obs-text/data/locale/ka-GE.ini
Normal file
34
plugins/obs-text/data/locale/ka-GE.ini
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
TextGDIPlus="Text (GDI+)"
|
||||
Font="შრიფტი"
|
||||
Text="ტექსტი"
|
||||
ReadFromFile="ფაილიდან წაკითხვა"
|
||||
TextFile="ტექსტური ფაილი (UTF-8)"
|
||||
Filter.TextFiles="ტექსტური ფაილები"
|
||||
Filter.AllFiles="ყველა ფაილი"
|
||||
Color="ფერი"
|
||||
Opacity="გაუმჭვირვალობა"
|
||||
Gradient="გრადიენტი"
|
||||
Gradient.Color="გრადიენტის ფერი"
|
||||
Gradient.Opacity="გრადიენტის გაუმჭვირვალობა"
|
||||
Gradient.Direction="გრადიენტის მიმართულება"
|
||||
BkColor="ფონის ფერი"
|
||||
BkOpacity="ფონის გაუმჭვივალობა"
|
||||
Alignment="განლაგება"
|
||||
Alignment.Left="მარცხნივ"
|
||||
Alignment.Center="შუაში"
|
||||
Alignment.Right="მარჯვნივ"
|
||||
Vertical="შვეულად"
|
||||
VerticalAlignment="შვეული განლაგება"
|
||||
VerticalAlignment.Top="ზემოთ"
|
||||
VerticalAlignment.Bottom="ქვემოთ"
|
||||
Outline="გარემოხაზულობა"
|
||||
Outline.Size="გარემოხაზულობის ზომა"
|
||||
Outline.Color="გარემოხაზულობის ფერი"
|
||||
Outline.Opacity="გარემოხაზულობის გაუმჭვირვალობა"
|
||||
ChatlogMode="სასაუბროს (Chatlog) რეჟიმი"
|
||||
ChatlogMode.Lines="სასაუბროს ხაზების შეზღუდვა"
|
||||
UseCustomExtents="ტექსტის ველის მითითებული ზომის გამოყენება"
|
||||
UseCustomExtents.Wrap="ხაზზე გადატანა"
|
||||
Width="სიგანე"
|
||||
Height="სიმაღლე"
|
||||
|
||||
21
plugins/obs-transitions/data/locale/bg-BG.ini
Normal file
21
plugins/obs-transitions/data/locale/bg-BG.ini
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
CutTransition="Изрязване"
|
||||
Direction="Посока"
|
||||
Color="Цвят"
|
||||
VideoFile="Видеофайл"
|
||||
TransitionPointTypeFrame="Рамка"
|
||||
TransitionPointTypeTime="Време (в милисекунди)"
|
||||
LumaWipe.Image="Изображение"
|
||||
LumaWipe.Type.Burst="Избухване"
|
||||
LumaWipe.Type.CheckerboardSmall="Шахматна дъсчица"
|
||||
LumaWipe.Type.Circles="Кръгове"
|
||||
LumaWipe.Type.Clock="Часовник"
|
||||
LumaWipe.Type.Cloud="Облак"
|
||||
LumaWipe.Type.Fan="Вентилатор"
|
||||
LumaWipe.Type.Fractal="Фрактал"
|
||||
LumaWipe.Type.Iris="Ирис"
|
||||
LumaWipe.Type.Square="Квадрат"
|
||||
LumaWipe.Type.Squares="Квадрати"
|
||||
LumaWipe.Type.Stripes="Ивици"
|
||||
LumaWipe.Type.ZigzagHorizontal="Водоравен зигзаг"
|
||||
LumaWipe.Type.ZigzagVertical="Отвесен зигзаг"
|
||||
|
||||
|
|
@ -1,9 +1,66 @@
|
|||
FadeTransition="Ξεθώριασμα"
|
||||
CutTransition="Αποκοπή"
|
||||
SwipeTransition="Σύρσιμο"
|
||||
SlideTransition="Ολίσθηση"
|
||||
StingerTransition="Τσούξιμο"
|
||||
FadeToColorTransition="Ξεθωριάζει το Χρώμα"
|
||||
Direction="Κατεύθυνση"
|
||||
Direction.Left="Αριστερά"
|
||||
Direction.Right="Δεξιά"
|
||||
Direction.Up="Επάνω"
|
||||
Direction.Down="Κάτω"
|
||||
SwipeIn="Σύρετε προς τα επάνω"
|
||||
Color="Χρώμα"
|
||||
VideoFile="Αρχείο Βίντεο"
|
||||
TransitionPoint="Ταχύτητα μετάβασης (χιλιοστά δευτερολέπτου)"
|
||||
TransitionPointFrame="Σημείο μετάβασης (πλαίσιο)"
|
||||
TransitionPointType="Τύπος σημείου μετάβασης"
|
||||
TransitionPointTypeFrame="Καρέ"
|
||||
TransitionPointTypeTime="Χρόνος (χιλιοστά δευτερολέπτου)"
|
||||
AudioFadeStyle="Στυλ ήχου Fade"
|
||||
AudioFadeStyle.FadeOutFadeIn="Fade out στο σημείο μετάβασης στη συνέχεια, fade in"
|
||||
AudioFadeStyle.CrossFade="Σταδιακή Εξασθένιση"
|
||||
SwitchPoint="Peak Χρώμα Σημείου (ποσοστό)"
|
||||
LumaWipeTransition="Luma Wipe"
|
||||
LumaWipe.Image="Εικόνα"
|
||||
LumaWipe.Invert="Αντιστροφή"
|
||||
LumaWipe.Softness="Απαλότητα"
|
||||
LumaWipe.Type.BarndoorBottomLeft="Barndoor Κάτω Αριστερά"
|
||||
LumaWipe.Type.BarndoorHorizontal="Barndoor οριζόντια"
|
||||
LumaWipe.Type.BarndoorTopLeft="Barndoor Πάνω Αριστερά"
|
||||
LumaWipe.Type.BarndoorVertical="Barndoor Κάθετα"
|
||||
LumaWipe.Type.BlindsHorizontal="Barndoor οριζόντια"
|
||||
LumaWipe.Type.BoxBottomLeft="Κουτί Κάτω Αριστερά"
|
||||
LumaWipe.Type.BoxBottomRight="Κουτί Κάτω Δεξιά"
|
||||
LumaWipe.Type.BoxTopLeft="Κουτί Πάνω Αριστερά"
|
||||
LumaWipe.Type.BoxTopRight="Κουτί Πάνω Δεξιά"
|
||||
LumaWipe.Type.Burst="Έκρηξη"
|
||||
LumaWipe.Type.CheckerboardSmall="Μικρή σκακιέρα"
|
||||
LumaWipe.Type.Circles="Κύκλοι"
|
||||
LumaWipe.Type.Clock="Ρολόι"
|
||||
LumaWipe.Type.Cloud="Σύννεφο"
|
||||
LumaWipe.Type.Curtain="Κουρτίνες"
|
||||
LumaWipe.Type.Fan="Ανεμιστήρας"
|
||||
LumaWipe.Type.Fractal="Φράκταλ"
|
||||
LumaWipe.Type.Iris="Ίρις"
|
||||
LumaWipe.Type.LinearHorizontal="Γραμμική Οριζόντια"
|
||||
LumaWipe.Type.LinearTopLeft="Γραμμική Πάνω Αριστερά"
|
||||
LumaWipe.Type.LinearTopRight="Γραμμική Πάνω Δεξιά"
|
||||
LumaWipe.Type.LinearVertical="Γραμμική Κατακόρυφα"
|
||||
LumaWipe.Type.ParallelZigzagHorizontal="Παράλληλα Ζιγκ-Ζαγκ Οριζόντια"
|
||||
LumaWipe.Type.ParallelZigzagVertical="Παράλληλα Ζιγκ-Ζαγκ Κάθετα"
|
||||
LumaWipe.Type.Sinus9="Sinus 9"
|
||||
LumaWipe.Type.Spiral="Σπείρα"
|
||||
LumaWipe.Type.Square="Τετράγωνο"
|
||||
LumaWipe.Type.Squares="Τετράγωνα"
|
||||
LumaWipe.Type.Stripes="Ρίγες"
|
||||
LumaWipe.Type.StripsHorizontal="Οριζόντια Αναστροφή"
|
||||
LumaWipe.Type.StripsVertical="Κάθετη Αναστροφή"
|
||||
LumaWipe.Type.Watercolor="Ακουαρέλα"
|
||||
LumaWipe.Type.ZigzagHorizontal="Γραμμική Οριζόντια"
|
||||
LumaWipe.Type.ZigzagVertical="Γραμμική Κατακόρυφα"
|
||||
AudioMonitoring="Ηχητική παρακολούθηση"
|
||||
AudioMonitoring.None="Monitor Off"
|
||||
AudioMonitoring.MonitorOnly="Μόνο η οθόνη (σίγαση εξόδου)"
|
||||
AudioMonitoring.Both="Παρακολούθηση και έξοδος"
|
||||
|
||||
|
|
|
|||
26
plugins/obs-transitions/data/locale/gd-GB.ini
Normal file
26
plugins/obs-transitions/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
FadeTransition="Crìon"
|
||||
CutTransition="Gearr às"
|
||||
SwipeTransition="Grad-shlaighd"
|
||||
SlideTransition="Sleamhnaich"
|
||||
Direction="Comhair"
|
||||
Direction.Left="Gu clì"
|
||||
Direction.Right="Gu deas"
|
||||
Direction.Up="Suas"
|
||||
Direction.Down="Sìos"
|
||||
SwipeIn="Grad-shlaighd a-steach"
|
||||
Color="Dath"
|
||||
AudioFadeStyle.CrossFade="Tar-chrìonadh"
|
||||
LumaWipe.Image="Dealbh"
|
||||
LumaWipe.Invert="Ais-thionndaidh"
|
||||
LumaWipe.Type.Circles="Cearcallan"
|
||||
LumaWipe.Type.Clock="Cleoc"
|
||||
LumaWipe.Type.Cloud="Neul"
|
||||
LumaWipe.Type.Square="Ceàrnag"
|
||||
LumaWipe.Type.Squares="Ceàrnagan"
|
||||
LumaWipe.Type.Stripes="Stiallan"
|
||||
LumaWipe.Type.Watercolor="Dath-uisge"
|
||||
AudioMonitoring="Sgrùdadh fuaime"
|
||||
AudioMonitoring.None="Gun sgrùdadh"
|
||||
AudioMonitoring.MonitorOnly="Sgrùdadh a-mhàin (mùch an t-às-chur)"
|
||||
AudioMonitoring.Both="Sgrùdadh is às-chur"
|
||||
|
||||
66
plugins/obs-transitions/data/locale/ka-GE.ini
Normal file
66
plugins/obs-transitions/data/locale/ka-GE.ini
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
FadeTransition="მილევა"
|
||||
CutTransition="მოჭრა"
|
||||
SwipeTransition="შენაცვლება"
|
||||
SlideTransition="გადაწევა"
|
||||
StingerTransition="Stinger"
|
||||
FadeToColorTransition="ფერში გადასვლა"
|
||||
Direction="მიმართულება"
|
||||
Direction.Left="მარცხნივ"
|
||||
Direction.Right="მარჯვნივ"
|
||||
Direction.Up="ზემოთ"
|
||||
Direction.Down="ქვემოთ"
|
||||
SwipeIn="უძრავად შენაცვლება"
|
||||
Color="ფერი"
|
||||
VideoFile="ვიდეოფაილი"
|
||||
TransitionPoint="გადასვლის წერტილი (მილიწამი)"
|
||||
TransitionPointFrame="გადასვლის წერტილი (კადრი)"
|
||||
TransitionPointType="გადასვლის წერტილის სახეობა"
|
||||
TransitionPointTypeFrame="კადრი"
|
||||
TransitionPointTypeTime="დრო (წამები)"
|
||||
AudioFadeStyle="ხმის მილევის ნაირსახეობა"
|
||||
AudioFadeStyle.FadeOutFadeIn="თანდათან მილევა გადასვლის წერტილში და შემდეგ მომატება"
|
||||
AudioFadeStyle.CrossFade="ჯვარედინი გადასვლა"
|
||||
SwitchPoint="ფერის უმაღლესი წერტილი (პროცენტი)"
|
||||
LumaWipeTransition="Luma Wipe"
|
||||
LumaWipe.Image="სურათი"
|
||||
LumaWipe.Invert="შებრუნება"
|
||||
LumaWipe.Softness="სირბილე"
|
||||
LumaWipe.Type.BarndoorBottomLeft="მარცხნივ ქვემოთ დახრილი გადაფარვა"
|
||||
LumaWipe.Type.BarndoorHorizontal="თარაზული გადაფარვა"
|
||||
LumaWipe.Type.BarndoorTopLeft="მარცხნივ ზემოთ დახრილი გადაფარვა"
|
||||
LumaWipe.Type.BarndoorVertical="შვეული გადაფარვა"
|
||||
LumaWipe.Type.BlindsHorizontal="თარაზული ჟალუზები"
|
||||
LumaWipe.Type.BoxBottomLeft="ქვედა მარცხენა კუთხიდან გადაფარვა"
|
||||
LumaWipe.Type.BoxBottomRight="ქვედა მარჯვენა კუთხიდან გადაფარვა"
|
||||
LumaWipe.Type.BoxTopLeft="ზედა მარცხენა კუთხიდან გადაფარვა"
|
||||
LumaWipe.Type.BoxTopRight="ზედა მარჯვენა კუთხიდან გადაფარვა"
|
||||
LumaWipe.Type.Burst="აფეთქება"
|
||||
LumaWipe.Type.CheckerboardSmall="უჯრები"
|
||||
LumaWipe.Type.Circles="წრეები"
|
||||
LumaWipe.Type.Clock="საათი"
|
||||
LumaWipe.Type.Cloud="ღრუბელი"
|
||||
LumaWipe.Type.Curtain="ფარდა"
|
||||
LumaWipe.Type.Fan="დატრიალება"
|
||||
LumaWipe.Type.Fractal="ნამსხვრევები"
|
||||
LumaWipe.Type.Iris="წერტილოვანი"
|
||||
LumaWipe.Type.LinearHorizontal="ხაზოვანი თარაზულად"
|
||||
LumaWipe.Type.LinearTopLeft="ხაზოვანი ზედა მარცხენა კუთხიდან"
|
||||
LumaWipe.Type.LinearTopRight="ხაზოვანი ზედა მარჯვენა კუთხიდან"
|
||||
LumaWipe.Type.LinearVertical="ხაზოვანი შვეულად"
|
||||
LumaWipe.Type.ParallelZigzagHorizontal="პარალელური თარაზული ტეხილები"
|
||||
LumaWipe.Type.ParallelZigzagVertical="პარალელური შვეული ტეხილები"
|
||||
LumaWipe.Type.Sinus9="თხევადი"
|
||||
LumaWipe.Type.Spiral="ხვეული"
|
||||
LumaWipe.Type.Square="მართკუთხა"
|
||||
LumaWipe.Type.Squares="მართკუთხედები"
|
||||
LumaWipe.Type.Stripes="ზოლები"
|
||||
LumaWipe.Type.StripsHorizontal="თარაზული ზოლები"
|
||||
LumaWipe.Type.StripsVertical="შვეული ზოლები"
|
||||
LumaWipe.Type.Watercolor="წყლის საღებავი"
|
||||
LumaWipe.Type.ZigzagHorizontal="თარაზული ტეხილი"
|
||||
LumaWipe.Type.ZigzagVertical="შვეული ტეხილი"
|
||||
AudioMonitoring="ხმის მოსმენა"
|
||||
AudioMonitoring.None="მოსმენის გარეშე"
|
||||
AudioMonitoring.MonitorOnly="მხოლოდ მოსმენა (უხმო გამომავალი სიგნალით)"
|
||||
AudioMonitoring.Both="მოსმენა და გამოტანა"
|
||||
|
||||
|
|
@ -237,8 +237,8 @@ static void stinger_transition_start(void *data)
|
|||
(long double)s->transition_point_ns /
|
||||
(long double)s->duration_ns);
|
||||
|
||||
if (s->transition_point > 1.0f)
|
||||
s->transition_point = 1.0f;
|
||||
if (s->transition_point > 0.999f)
|
||||
s->transition_point = 0.999f;
|
||||
else if (s->transition_point < 0.001f)
|
||||
s->transition_point = 0.001f;
|
||||
|
||||
|
|
|
|||
13
plugins/obs-x264/data/locale/gd-GB.ini
Normal file
13
plugins/obs-x264/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
Bitrate="Reat bhiotaichean"
|
||||
CustomBufsize="Cleachd meud bufair gnàthaichte"
|
||||
BufferSize="Meud a’ bhufair"
|
||||
RateControl="Smachd air an reat"
|
||||
CRF="CRF"
|
||||
KeyframeIntervalSec="Eadaramh nam frèamaichean-iuchrach (diog, fèin-obrachail)"
|
||||
CPUPreset="Ro-shuidheachadh cleachdadh a’ CPU (nas àirde = nas lugha dhen CPU)"
|
||||
Profile="Pròifil"
|
||||
Tune="Gleus"
|
||||
None="(Chan eil gin)"
|
||||
EncoderOptions="Roghainnean x264 (’gan sgaradh le geal-spàs)"
|
||||
VFR="Reat fhrèamaichean caochlaideach (VFR)"
|
||||
|
||||
|
|
@ -1,2 +1,13 @@
|
|||
Bitrate="ბიტური სიხშირე"
|
||||
CustomBufsize="ბუფერის მითითებული ზომის გამოყენება"
|
||||
BufferSize="ბუფერის ზომა"
|
||||
RateControl="სიხშირის მართვა"
|
||||
CRF="CRF"
|
||||
KeyframeIntervalSec="საკვანძო კადრებს შორის შუალედი (წამი, 0=თვითშერჩევა)"
|
||||
CPUPreset="პროცესორის მოხმარების მზა პარამეტრები (მაღალი = ნაკლები CPU-დატვირთვა)"
|
||||
Profile="პროფილი"
|
||||
Tune="გამართვა"
|
||||
None="(არცერთი)"
|
||||
EncoderOptions="x264 პარამეტრები (ადგილის გამოტოვებით)"
|
||||
VFR="კადრის ცვლადი სიხშირე (VFR)"
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ CRF="CRF"
|
|||
KeyframeIntervalSec="关键帧间隔(秒, 0=自动)"
|
||||
CPUPreset="CPU 使用预设 (高 = 较少的 CPU占用)"
|
||||
Profile="Profile"
|
||||
Tune="Tune"
|
||||
Tune="协调(类型)"
|
||||
None="(无)"
|
||||
EncoderOptions="x264 选项 (用空格分隔)"
|
||||
VFR="可变帧率 (VFR)"
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ StreamingServices="Υπηρεσίες Μετάδοσης"
|
|||
CustomStreamingServer="Προσαρμοσμένος Διακομιστής Μετάδοσης"
|
||||
Service="Υπηρεσία"
|
||||
Server="Διακομιστής"
|
||||
Server.Auto="Αυτόματη (συνιστάται)"
|
||||
StreamKey="Κλειδί μετάδοσης"
|
||||
UseAuth="Χρήση πιστοποίησης"
|
||||
Username="Όνομα χρήστη"
|
||||
|
|
|
|||
11
plugins/rtmp-services/data/locale/gd-GB.ini
Normal file
11
plugins/rtmp-services/data/locale/gd-GB.ini
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
StreamingServices="Seirbheisean sruthaidh"
|
||||
CustomStreamingServer="Frithealaiche sruthaidh gnàthaichte"
|
||||
Service="Seirbheis"
|
||||
Server="Frithealaiche"
|
||||
Server.Auto="Fèin-obrachail (mholamaid seo)"
|
||||
StreamKey="Iuchair an t-sruthaidh"
|
||||
UseAuth="Cleachd dearbh-aithneachadh"
|
||||
Username="Ainm-cleachdaiche"
|
||||
Password="Facal-faire"
|
||||
ShowAll="Seall a h-uile seirbheis"
|
||||
|
||||
11
plugins/rtmp-services/data/locale/ka-GE.ini
Normal file
11
plugins/rtmp-services/data/locale/ka-GE.ini
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
StreamingServices="ნაკადის გაშვების მომსახურებები"
|
||||
CustomStreamingServer="ნაკადის გასაშვები საკუთარი სერვერი"
|
||||
Service="მომსახურება"
|
||||
Server="სერვერი"
|
||||
Server.Auto="ავტომატური (სასურველია)"
|
||||
StreamKey="ნაკადის გასაღები"
|
||||
UseAuth="ანგარიშზე შესვლის გამოყენება"
|
||||
Username="მომხმარებლის სახელი"
|
||||
Password="პაროლი"
|
||||
ShowAll="ყველა მომსახურების ჩვენება"
|
||||
|
||||
|
|
@ -1,10 +1,10 @@
|
|||
{
|
||||
"url": "https://obsproject.com/obs2_update/rtmp-services",
|
||||
"version": 80,
|
||||
"version": 88,
|
||||
"files": [
|
||||
{
|
||||
"name": "services.json",
|
||||
"version": 80
|
||||
"version": 88
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -537,9 +537,27 @@
|
|||
"servers": [
|
||||
{
|
||||
"name": "Primary",
|
||||
"url": "rtmp://www.gameplank.tv/live"
|
||||
"url": "rtmp://live.gameplank.tv/app"
|
||||
},
|
||||
{
|
||||
"name": "US: Oregon",
|
||||
"url": "rtmp://live-or.gameplank.tv/app"
|
||||
},
|
||||
{
|
||||
"name": "US: Virginia",
|
||||
"url": "rtmp://live-va.gameplank.tv/app"
|
||||
},
|
||||
{
|
||||
"name": "UK: London",
|
||||
"url": "rtmp://live-ldn.gameplank.tv/app"
|
||||
}
|
||||
]
|
||||
],
|
||||
"recommended": {
|
||||
"keyint": 1,
|
||||
"max video bitrate": 1500,
|
||||
"max audio bitrate": 160,
|
||||
"x264opts": "scenecut=0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Vaughn Live / iNSTAGIB",
|
||||
|
|
@ -635,7 +653,7 @@
|
|||
"servers": [
|
||||
{
|
||||
"name": "Default",
|
||||
"url": "rtmp://rtmp-api.facebook.com:80/rtmp/"
|
||||
"url": "rtmps://rtmp-api.facebook.com:443/rtmp/"
|
||||
}
|
||||
],
|
||||
"recommended": {
|
||||
|
|
@ -649,6 +667,10 @@
|
|||
"name": "Restream.io",
|
||||
"common": true,
|
||||
"servers": [
|
||||
{
|
||||
"name": "Autodetect",
|
||||
"url": "rtmp://live.restream.io/live"
|
||||
},
|
||||
{
|
||||
"name": "EU-West (London, GB)",
|
||||
"url": "rtmp://eu-london.restream.io/live"
|
||||
|
|
@ -661,6 +683,10 @@
|
|||
"name": "EU-West (Luxembourg)",
|
||||
"url": "rtmp://eu-luxembourg.restream.io/live"
|
||||
},
|
||||
{
|
||||
"name": "EU-West (Paris, FR)",
|
||||
"url": "rtmp://eu-paris.restream.io/live"
|
||||
},
|
||||
{
|
||||
"name": "EU-Central (Frankfurt, DE)",
|
||||
"url": "rtmp://eu-central.restream.io/live"
|
||||
|
|
@ -797,7 +823,48 @@
|
|||
"recommended": {
|
||||
"keyint": 2,
|
||||
"max video bitrate": 25000,
|
||||
"max audio bitrate": 192
|
||||
"max audio bitrate": 192,
|
||||
"x264opts": "scenecut=0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Castr.io",
|
||||
"servers": [
|
||||
{
|
||||
"name": "Chicago US",
|
||||
"url": "rtmp://cg.castr.io"
|
||||
},
|
||||
{
|
||||
"name": "Los Angeles US",
|
||||
"url": "rtmp://la.castr.io"
|
||||
},
|
||||
{
|
||||
"name": "Montreal CA",
|
||||
"url": "rtmp://qc.castr.io"
|
||||
},
|
||||
{
|
||||
"name": "London UK",
|
||||
"url": "rtmp://uk.castr.io"
|
||||
},
|
||||
{
|
||||
"name": "Frankfurt DE",
|
||||
"url": "rtmp://de.castr.io"
|
||||
},
|
||||
{
|
||||
"name": "Moscow RU",
|
||||
"url": "rtmp://ru.castr.io"
|
||||
},
|
||||
{
|
||||
"name": "Singapore",
|
||||
"url": "rtmp://sg.castr.io"
|
||||
},
|
||||
{
|
||||
"name": "Sydney AU",
|
||||
"url": "rtmp://au.castr.io"
|
||||
}
|
||||
],
|
||||
"recommended": {
|
||||
"keyint": 2
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -1073,9 +1140,9 @@
|
|||
}
|
||||
],
|
||||
"recommended": {
|
||||
"keyint": 2,
|
||||
"max video bitrate": 800,
|
||||
"max audio bitrate": 96
|
||||
"keyint": 3,
|
||||
"max video bitrate": 4000,
|
||||
"max audio bitrate": 128
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -1232,6 +1299,40 @@
|
|||
"url": "rtmp://rtmp.cdn.asset.aparat.com:443/event"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "KakaoTV",
|
||||
"servers": [
|
||||
{
|
||||
"name": "Default",
|
||||
"url": "rtmp://rtmp.play.kakao.com/kakaotv"
|
||||
}
|
||||
],
|
||||
"recommended": {
|
||||
"max video bitrate": 8000,
|
||||
"max audio bitrate": 192
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Piczel.tv",
|
||||
"servers": [
|
||||
{
|
||||
"name": "Default",
|
||||
"url": "rtmp://piczel.tv:1935/live"
|
||||
}
|
||||
],
|
||||
"recommended": {
|
||||
"max video bitrate": 5000
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "DTube",
|
||||
"servers": [
|
||||
{
|
||||
"name": "Default",
|
||||
"url": "rtmp://stream.dtube.top/live/"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,6 +26,39 @@ static inline const char *get_string_val(json_t *service, const char *key);
|
|||
|
||||
extern void twitch_ingests_refresh(int seconds);
|
||||
|
||||
static void ensure_valid_url(struct rtmp_common *service, json_t *json,
|
||||
obs_data_t *settings)
|
||||
{
|
||||
json_t *servers = json_object_get(json, "servers");
|
||||
const char *top_url = NULL;
|
||||
json_t *server;
|
||||
size_t index;
|
||||
|
||||
if (!service->server || !servers || !json_is_array(servers))
|
||||
return;
|
||||
if (astrstri(service->service, "Facebook") == NULL)
|
||||
return;
|
||||
|
||||
json_array_foreach (servers, index, server) {
|
||||
const char *url = get_string_val(server, "url");
|
||||
if (!url)
|
||||
continue;
|
||||
|
||||
if (!top_url)
|
||||
top_url = url;
|
||||
|
||||
if (astrcmpi(service->server, url) == 0)
|
||||
return;
|
||||
}
|
||||
|
||||
/* server was not found in server list, use first server instead */
|
||||
if (top_url) {
|
||||
bfree(service->server);
|
||||
service->server = bstrdup(top_url);
|
||||
obs_data_set_string(settings, "server", top_url);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtmp_common_update(void *data, obs_data_t *settings)
|
||||
{
|
||||
struct rtmp_common *service = data;
|
||||
|
|
@ -50,6 +83,8 @@ static void rtmp_common_update(void *data, obs_data_t *settings)
|
|||
if (out)
|
||||
service->output = bstrdup(out);
|
||||
}
|
||||
|
||||
ensure_valid_url(service, serv, settings);
|
||||
}
|
||||
}
|
||||
json_decref(root);
|
||||
|
|
@ -295,7 +330,7 @@ static void fill_servers(obs_property_t *servers_prop, json_t *service,
|
|||
obs_property_list_add_string(servers_prop,
|
||||
obs_module_text("Server.Auto"), "auto");
|
||||
}
|
||||
if (name && strcmp(name, "Twitch") == 0) {
|
||||
if (strcmp(name, "Twitch") == 0) {
|
||||
if (fill_twitch_servers(servers_prop))
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue