From 27d1d08d9125dc46f252073aaf1fead7518ee4c8 Mon Sep 17 00:00:00 2001 From: Good Guy Date: Sat, 28 Jan 2017 15:11:13 -0700 Subject: [PATCH] textbox cursor fix, h265 param files, bluray updates, new-proj theme fixes --- cinelerra-5.1/cinelerra/bdcreate.C | 26 +- cinelerra-5.1/cinelerra/bdwrite.C | 147 +++++++--- cinelerra-5.1/cinelerra/ffmpeg.C | 112 ++++++-- cinelerra-5.1/cinelerra/ffmpeg.h | 7 +- cinelerra-5.1/cinelerra/fileffmpeg.C | 2 + cinelerra-5.1/cinelerra/new.C | 62 ++--- cinelerra-5.1/cinelerra/render.C | 15 +- cinelerra-5.1/configure.ac | 2 +- cinelerra-5.1/ffmpeg/audio/bluray.m2ts | 2 +- cinelerra-5.1/ffmpeg/format/bluray | 7 + cinelerra-5.1/ffmpeg/plugin.opts | 1 + cinelerra-5.1/ffmpeg/video/avc422.m2ts | 15 +- cinelerra-5.1/ffmpeg/video/bluray.m2ts | 13 +- cinelerra-5.1/ffmpeg/video/bluray_lo.m2ts | 13 +- cinelerra-5.1/ffmpeg/video/h265-12bit.mp4 | 9 + .../ffmpeg/video/{h265.mp4 => h265-hi.mp4} | 1 + cinelerra-5.1/ffmpeg/video/h265-lo.mp4 | 3 + cinelerra-5.1/ffmpeg/video/h265-med.mp4 | 3 + cinelerra-5.1/ffmpeg/video/hevc422p10.m2ts | 5 +- cinelerra-5.1/ffmpeg/video/hevc422p8.m2ts | 3 +- cinelerra-5.1/ffmpeg/video/lossless.m2ts | 2 + .../ffmpeg/video/visually_lossless.m2ts | 19 ++ cinelerra-5.1/guicast/bcfilebox.C | 26 +- cinelerra-5.1/guicast/bctextbox.C | 17 +- cinelerra-5.1/guicast/bcwindowbase.C | 52 ++-- cinelerra-5.1/guicast/bcwindowbase.h | 2 + .../plugins/theme_blond/data/new_bg.png | Bin 3133 -> 3349 bytes .../plugins/theme_blond_cv/data/new_bg.png | Bin 7642 -> 8486 bytes .../plugins/theme_blue/data/new_bg.png | Bin 3613 -> 3854 bytes .../plugins/theme_blue_dot/data/new_bg.png | Bin 4813 -> 5618 bytes .../plugins/theme_bright/data/new_bg.png | Bin 1898 -> 2628 bytes .../plugins/theme_hulk/data/new_bg.png | Bin 3689 -> 3922 bytes .../plugins/theme_pinklady/data/new_bg.png | Bin 3817 -> 4055 bytes .../plugins/theme_suv/data/new_bg.png | Bin 1900 -> 2652 bytes .../plugins/theme_unflat/data/new_bg.png | Bin 3037 -> 3219 bytes cinelerra-5.1/thirdparty/src/ffmpeg.patch4 | 261 ++++++++++++++++++ 36 files changed, 647 insertions(+), 180 deletions(-) create mode 100644 cinelerra-5.1/ffmpeg/format/bluray create mode 100644 cinelerra-5.1/ffmpeg/video/h265-12bit.mp4 rename cinelerra-5.1/ffmpeg/video/{h265.mp4 => h265-hi.mp4} (66%) create mode 100644 cinelerra-5.1/ffmpeg/video/h265-lo.mp4 create mode 100644 cinelerra-5.1/ffmpeg/video/h265-med.mp4 create mode 100644 cinelerra-5.1/ffmpeg/video/visually_lossless.m2ts create mode 100644 cinelerra-5.1/thirdparty/src/ffmpeg.patch4 diff --git a/cinelerra-5.1/cinelerra/bdcreate.C b/cinelerra-5.1/cinelerra/bdcreate.C index 57c207ba..b784d0ed 100644 --- a/cinelerra-5.1/cinelerra/bdcreate.C +++ b/cinelerra-5.1/cinelerra/bdcreate.C @@ -46,10 +46,10 @@ static struct bd_format { { "1920x1080 24p", 1920,1080, 24., 1, ILACE_MODE_NOTINTERLACED }, { "1920x1080 25i", 1920,1080, 25., 1, ILACE_MODE_TOP_FIRST }, { "1920x1080 23.976p", 1920,1080, 23.976, 1, ILACE_MODE_NOTINTERLACED }, - { "1440x1080 29.97i", 1440,1080, 29.97, 1, ILACE_MODE_TOP_FIRST }, - { "1440x1080 25i", 1440,1080, 25., 1, ILACE_MODE_TOP_FIRST }, - { "1440x1080 24p", 1440,1080, 24., 1, ILACE_MODE_NOTINTERLACED }, - { "1440x1080 23.976p", 1440,1080, 23.976, 1, ILACE_MODE_NOTINTERLACED }, + { "1440x1080 29.97i", 1440,1080, 29.97, -1, ILACE_MODE_TOP_FIRST }, + { "1440x1080 25i", 1440,1080, 25., -1, ILACE_MODE_TOP_FIRST }, + { "1440x1080 24p", 1440,1080, 24., -1, ILACE_MODE_NOTINTERLACED }, + { "1440x1080 23.976p", 1440,1080, 23.976,-1, ILACE_MODE_NOTINTERLACED }, { "1280x720 59.94p", 1280,720, 59.94, 1, ILACE_MODE_NOTINTERLACED }, { "1280x720 50p", 1280,720, 50., 1, ILACE_MODE_NOTINTERLACED }, { "1280x720 24p", 1280,720, 24., 1, ILACE_MODE_NOTINTERLACED }, @@ -69,8 +69,8 @@ const double CreateBD_Thread::BD_WIDE_ASPECT_HEIGHT = 9.; const double CreateBD_Thread::BD_ASPECT_WIDTH = 4.; const double CreateBD_Thread::BD_ASPECT_HEIGHT = 3.; const double CreateBD_Thread::BD_FRAMERATE = 24000. / 1001.; -const int CreateBD_Thread::BD_MAX_BITRATE = 40000000; -//const int CreateBD_Thread::BD_MAX_BITRATE = 8000000; +//const int CreateBD_Thread::BD_MAX_BITRATE = 40000000; +const int CreateBD_Thread::BD_MAX_BITRATE = 10000000; const int CreateBD_Thread::BD_CHANNELS = 2; const int CreateBD_Thread::BD_WIDE_CHANNELS = 6; const double CreateBD_Thread::BD_SAMPLERATE = 48000; @@ -334,6 +334,7 @@ void CreateBD_Thread::handle_close_event(int result) edit->startproject, edit->length, PLUGIN_STANDALONE, 0, &keyframe, 0); } + vtrk->optimize(); } } if( use_resize_tracks ) @@ -803,6 +804,7 @@ insert_video_plugin(const char *title, KeyFrame *default_keyframe) edit->startproject, edit->length, PLUGIN_STANDALONE, 0, default_keyframe, 0); } + vtrk->optimize(); } return 0; } @@ -838,10 +840,11 @@ option_presets() bd_width = bd_formats[use_standard].w; bd_height = bd_formats[use_standard].h; bd_framerate = bd_formats[use_standard].framerate; - bd_aspect_width = bd_formats[use_standard].wide ? - BD_WIDE_ASPECT_WIDTH : BD_ASPECT_WIDTH; - bd_aspect_height = bd_formats[use_standard].wide ? - BD_WIDE_ASPECT_HEIGHT : BD_ASPECT_HEIGHT; + int wide = bd_formats[use_standard].wide; + bd_aspect_width = wide < 0 ? 1. : + wide > 0 ? BD_WIDE_ASPECT_WIDTH : BD_ASPECT_WIDTH; + bd_aspect_height = wide < 0 ? 1. : + wide > 0 ? BD_WIDE_ASPECT_HEIGHT : BD_ASPECT_HEIGHT; bd_interlace_mode = bd_formats[use_standard].interlaced; double bd_aspect = bd_aspect_width / bd_aspect_height; @@ -865,7 +868,8 @@ option_presets() float aw, ah; MWindow::create_aspect_ratio(aw, ah, w, h); double aspect = ah > 0 ? aw / ah : 1; - if( !EQUIV(aspect, bd_aspect) ) use_scale = Rescale::scaled; + if( wide >= 0 && !EQUIV(aspect, bd_aspect) ) + use_scale = Rescale::scaled; } for( int i=0; iplugin_set.size(); ++i ) { for(Plugin *plugin = (Plugin*)trk->plugin_set[i]->first; diff --git a/cinelerra-5.1/cinelerra/bdwrite.C b/cinelerra-5.1/cinelerra/bdwrite.C index e70aa69a..a8596706 100644 --- a/cinelerra-5.1/cinelerra/bdwrite.C +++ b/cinelerra-5.1/cinelerra/bdwrite.C @@ -54,6 +54,7 @@ #define BCTEXTLEN 1024 #define BLURAY_TS_PKTSZ 192L +static const int bd_sig = 2; extern "C" { #include "libavfilter/buffersrc.h" @@ -186,15 +187,19 @@ class bs_length { int64_t fpos, len; public: bs_length() { fpos = len = 0; } + int64_t bs_posb(bs_file &bs) { return bs.posb() - fpos; } void bs_len(bs_file &bs, int n) { bs.write(len, n); fpos = bs.posb(); } void bs_end(bs_file &bs) { - len = bs.posb() - fpos; + len = bs_posb(bs); } void bs_ofs(bs_file &bs, int n) { bs.write(fpos-n/8, n); } + void bs_zofs(bs_file &bs, int n) { + bs.write(!len ? 0 : fpos-n/8, n); + } }; class _bd_stream_info { @@ -580,6 +585,15 @@ public: ~clpi_cpi() { remove_all_objects(); } }; +class clpi_cmrk : public bs_length { +public: + int write(); + + clpi_cmrk() {} + ~clpi_cmrk() {} +}; + + class bd_uo_mask { public: unsigned int menu_call : 1; @@ -890,7 +904,7 @@ public: int write_pip_metadata_extension(); int write(); - mpls_pl() { sig = 1; } + mpls_pl() { sig = bd_sig; } ~mpls_pl() { play_item.remove_all_objects(); sub_path.remove_all_objects(); @@ -922,6 +936,7 @@ public: clpi_extents extents; clpi_programs programs_ss; clpi_cpi cpi_ss; + clpi_cmrk cmrk; int write_header(); int write(); @@ -929,7 +944,7 @@ public: int write_clpi_extension(int id1, int id2, void *handle); int write_mpls_extension(int id1, int id2, void *handle); - clpi_cl() { sig = 1; } + clpi_cl() { sig = bd_sig; } ~clpi_cl() {} }; @@ -983,7 +998,7 @@ public: int sig; ArrayList movies; - movie_file() { sig = 1; } + movie_file() { sig = bd_sig; } ~movie_file() { movies.remove_all_objects(); } @@ -1062,7 +1077,7 @@ public: int write(); index_file() { - sig = 1; + sig = bd_sig; memset(user_data, 0, sizeof(user_data)); } ~index_file() { @@ -1086,7 +1101,7 @@ public: int sig; int write(); - bdid() { sig = 1; } + bdid() { sig = bd_sig; } ~bdid() {} }; @@ -1200,6 +1215,7 @@ public: ArrayList cl; ArrayList pl; + void add_movie(uint32_t *ops, int n); int compose(); int write(char *fn); @@ -1402,7 +1418,7 @@ index_file::write() bs.writeb("INDX", 4); bs.writeb(sig == 1 ? "0100" : "0200", 4); bs_ofs(bs, 32); - exten.bs_ofs(bs, 32); + exten.bs_zofs(bs, 32); int appinfo_start = 0x28; bs.posb(appinfo_start); appinf.bs_len(bs, 32); @@ -1530,6 +1546,7 @@ clpi_prog_stream::write() return 1; }; + bs.padb(0x15 - bs_posb(bs)); bs_end(bs); return 0; } @@ -1734,6 +1751,14 @@ clpi_cpi::write() return 0; } +int +clpi_cmrk::write() +{ + bs_len(bs, 32); + bs_end(bs); + return 0; +} + int clpi_extents::write() { @@ -1787,6 +1812,8 @@ clpi_cl::write() if( programs.write() ) return 1; cpi_start_addr = bs.posb(); if( cpi.write() ) return 1; + clip_mark_start_addr = bs.posb(); + if( cmrk.write() ) return 1; //if( has_ext_data ) { // ext_data_start_addr = bs.pos(); // bdmv_write_extension_data(write_clpi_extension, this); @@ -1897,6 +1924,7 @@ write() fprintf(stderr, "unrecognized stream type %02x\n", stream_type); break; }; + bs.padb(9 - strm.bs_posb(bs)); strm.bs_end(bs); code.bs_len(bs, 8); @@ -1940,6 +1968,7 @@ write() fprintf(stderr, "mpls_stream: unrecognized coding type %02x\n", coding_type); break; }; + bs.padb(5 - code.bs_posb(bs)); code.bs_end(bs); return 0; } @@ -2303,14 +2332,20 @@ mkbdmv(char *path) char bdmv_path[BCTEXTLEN]; sprintf(bdmv_path, "%s/BDMV", path); if( mk_bdmv_dir(bdmv_path) ) return 1; + char cert_path[BCTEXTLEN]; + sprintf(cert_path, "%s/CERTIFICATE", path); + if( mk_bdmv_dir(cert_path) ) return 1; + char cert_backup[BCTEXTLEN]; + sprintf(cert_backup, "%s/BACKUP", cert_path); + if( mk_bdmv_dir(cert_backup) ) return 1; char stream_path[BCTEXTLEN]; - sprintf(stream_path, "%s/BDMV/STREAM", path); + sprintf(stream_path, "%s/STREAM", bdmv_path); if( mk_dir(stream_path) ) return 1; char auxdata_path[BCTEXTLEN]; - sprintf(auxdata_path, "%s/BDMV/AUXDATA", path); + sprintf(auxdata_path, "%s/AUXDATA", bdmv_path); if( mk_dir(auxdata_path) ) return 1; char meta_path[BCTEXTLEN]; - sprintf(meta_path, "%s/BDMV/META", path); + sprintf(meta_path, "%s/META", bdmv_path); if( mk_dir(meta_path) ) return 1; char backup_path[BCTEXTLEN]; sprintf(backup_path, "%s/BACKUP", bdmv_path); @@ -2334,15 +2369,15 @@ build_toc(clpi_ep_map_entry *map) uint32_t pkt = mp->pos / BLURAY_TS_PKTSZ; if( last_pkt >= pkt ) continue; last_pkt = pkt; - int64_t coarse_pts = (pts >> 18) & ~0x01; + int64_t coarse_pts = (pts >> 18); // & ~0x01; int64_t fine_pts = (pts & 0x7ffff) >> 8; uint32_t mpkt = pkt & ~0x1ffff; - if( !cp || cp->pts_ep != coarse_pts || cp->spn_ep != mpkt ) { + if( !cp || cp->pts_ep != coarse_pts || mpkt > cp->spn_ep ) { cp = new clpi_ep_coarse(); map->coarse.append(cp); cp->ref_ep_fine_id = map->fine.size(); cp->pts_ep = coarse_pts; - cp->spn_ep = mpkt; + cp->spn_ep = pkt; } clpi_ep_fine *fp = new clpi_ep_fine(); map->fine.append(fp); @@ -2362,6 +2397,8 @@ static int bd_stream_type(AVCodecID codec_id) int stream_type = 0; switch (codec_id) { case AV_CODEC_ID_MPEG1VIDEO: + stream_type = BLURAY_STREAM_TYPE_VIDEO_MPEG1; + break; case AV_CODEC_ID_MPEG2VIDEO: stream_type = BLURAY_STREAM_TYPE_VIDEO_MPEG2; break; @@ -2369,18 +2406,26 @@ static int bd_stream_type(AVCodecID codec_id) stream_type = BLURAY_STREAM_TYPE_VIDEO_H264; break; case AV_CODEC_ID_MP2: - case AV_CODEC_ID_MP3: stream_type = BLURAY_STREAM_TYPE_AUDIO_MPEG1; break; + case AV_CODEC_ID_MP3: + stream_type = BLURAY_STREAM_TYPE_AUDIO_MPEG2; + break; case AV_CODEC_ID_AC3: stream_type = BLURAY_STREAM_TYPE_AUDIO_AC3; break; + case AV_CODEC_ID_EAC3: + stream_type = BLURAY_STREAM_TYPE_AUDIO_AC3PLUS; + break; case AV_CODEC_ID_DTS: stream_type = BLURAY_STREAM_TYPE_AUDIO_DTS; break; case AV_CODEC_ID_TRUEHD: stream_type = BLURAY_STREAM_TYPE_AUDIO_TRUHD; break; + case AV_CODEC_ID_HDMV_PGS_SUBTITLE: + stream_type = BLURAY_STREAM_TYPE_SUB_PG; + break; default: fprintf(stderr, "unknown bluray stream type %s\n", avcodec_get_name(codec_id)); exit(1); @@ -2524,6 +2569,7 @@ int media_info::scan() switch( type ) { case AVMEDIA_TYPE_VIDEO: break; case AVMEDIA_TYPE_AUDIO: break; + case AVMEDIA_TYPE_SUBTITLE: break; default: continue; } stream *s = new stream(type, i); @@ -2549,7 +2595,12 @@ int media_info::scan() s->coding_type = bd_stream_type(codec_id); s->format = bd_audio_format(st->codec->channels); s->rate = bd_audio_rate(st->codec->sample_rate); - strcpy((char*)s->lang, "und"); + strcpy((char*)s->lang, "eng"); + break; } + case AVMEDIA_TYPE_SUBTITLE: { + s->coding_type = bd_stream_type(codec_id); + AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", 0, 0); + strncpy((char*)s->lang, lang ? lang->value : "und", sizeof(s->lang)); break; } default: break; @@ -2574,7 +2625,7 @@ int media_info::scan() program *pgm = new program(-1, 1); pgm->ep_pid = ep_pid; pgm->pmt_pid = 0x1000; - pgm->pcr_pid = 0x100; + pgm->pcr_pid = 0x1001; pgm->duration = 0; for( int jj=0; jjstreams[jj]; @@ -2609,6 +2660,7 @@ int media_info::scan() if( ep_pid < 0 ) ep_pid = st->id; break; case AVMEDIA_TYPE_AUDIO: + case AVMEDIA_TYPE_SUBTITLE: break; default: continue; @@ -2647,7 +2699,7 @@ int media_info::scan(AVFormatContext *fmt_ctx) int ret = 0; AVPacket ipkt; av_init_packet(&ipkt); -#if 0 +#if 1 // zero pts at pos zero for( int i=0; iresume_intention_flag = 1; + uint32_t *eop = ops + n/sizeof(*ops); + while( ops < eop ) { + command_obj *cmd = new command_obj(); + cmd->cmd = htobe32(*ops++); + cmd->dst = *ops++; + cmd->src = *ops++; + mp->cmds.append(cmd); + } + mov.movies.append(mp); +} + int Media::compose() { -// index - bs.init(); - idx.sig = 1; - idx.first_play.set_hdmv(0, pb_typ_movie); - idx.top_menu.set_hdmv(0xffff, pb_typ_iactv); - // movie bs.init(); - mov.sig = 1; + +// top menu + int top_menu_obj = mov.movies.size(); movie_obj *mp = new movie_obj(); mp->resume_intention_flag = 1; command_obj *cmd = new command_obj(); cmd->cmd = htobe32(0x21810000); cmd->dst = 1; cmd->src = 0; mp->cmds.append(cmd); // JUMP_TITLE 1 - cmd = new command_obj(); - cmd->cmd = htobe32(0x00020000); cmd->dst = 0; cmd->src = 0; - mp->cmds.append(cmd); - mov.movies.append(mp); // BREAK - + mov.movies.append(mp); +// titles for( int ii=0; iiresume_intention_flag = 1; @@ -2745,15 +2806,19 @@ Media::compose() mov.movies.append(mp); // BREAK } +// first play + int first_play_obj = mov.movies.size(); mp = new movie_obj(); mp->resume_intention_flag = 1; cmd = new command_obj(); - cmd->cmd = htobe32(0x21810000); cmd->dst = 1; cmd->src = 0; - mp->cmds.append(cmd); // JUMP_TITLE 1 - cmd = new command_obj(); - cmd->cmd = htobe32(0x00020000); cmd->dst = 0; cmd->src = 0; - mp->cmds.append(cmd); - mov.movies.append(mp); // BREAK + cmd->cmd = htobe32(0x21810000); cmd->dst = 0; cmd->src = 0; + mp->cmds.append(cmd); // JUMP_TITLE 0 ; top menu + mov.movies.append(mp); + +// index + bs.init(); + idx.first_play.set_hdmv(first_play_obj, pb_typ_iactv); + idx.top_menu.set_hdmv(top_menu_obj, pb_typ_iactv); title_obj *tp = 0; // clips @@ -2776,7 +2841,7 @@ Media::compose() cp->clip.clip_stream_type = 1; cp->clip.application_type = BLURAY_APP_TYPE_MAIN_MOVIE; cp->clip.ts_recording_rate = ip->bit_rate; - uint32_t ts_pkt_count = ip->file_size / BLURAY_TS_PKTSZ + 1; + uint32_t ts_pkt_count = ip->file_size / BLURAY_TS_PKTSZ; cp->clip.num_source_packets = ts_pkt_count; cp->clip.ts_type_info.validity = 0x80; strcpy(cp->clip.ts_type_info.format_id, "HDMV"); @@ -2801,6 +2866,7 @@ Media::compose() s->aspect = sp->aspect; break; case AVMEDIA_TYPE_AUDIO: + case AVMEDIA_TYPE_SUBTITLE: memcpy(s->lang,sp->lang,sizeof(s->lang)); break; default: @@ -2809,6 +2875,7 @@ Media::compose() p->streams.append(s); } clpi_ep_map_entry *map = new clpi_ep_map_entry(pgm->ep_pid); + map->ep_stream_type = 1; pgm->build_toc(map); cp->cpi.append(map); cp->programs.append(p); @@ -2843,6 +2910,7 @@ Media::compose() pgm = ip->prog(); mpls_pi *pi = new mpls_pi(); pi->connection_condition = 1; // seamless +// pi->uo_mask.xxx = 1; pi->in_time = pgm->start_time; pi->out_time = pgm->end_time; if( ip->still ) @@ -2857,6 +2925,7 @@ Media::compose() switch( sp->type ) { case AVMEDIA_TYPE_VIDEO: break; case AVMEDIA_TYPE_AUDIO: break; + case AVMEDIA_TYPE_SUBTITLE: break; default: continue; } mpls_stream *ps = new mpls_stream(); @@ -2873,6 +2942,10 @@ Media::compose() memcpy(ps->lang, sp->lang, sizeof(ps->lang)); pi->stn.audio.append(ps); break; + case AVMEDIA_TYPE_SUBTITLE: + memcpy(ps->lang, sp->lang, sizeof(ps->lang)); + pi->stn.pg.append(ps); + break; default: break; } @@ -2880,7 +2953,7 @@ Media::compose() pp->play_item.append(pi); } // chapter marks every ch_duration ticks - int64_t ch_duration = 45000 * 60*10; + int64_t ch_duration = 45000 * 60*5; int64_t mrktm = ch_duration; int64_t plytm = 0; int pmark = 0, pitem = 0; diff --git a/cinelerra-5.1/cinelerra/ffmpeg.C b/cinelerra-5.1/cinelerra/ffmpeg.C index 3ba22244..60a17ed4 100644 --- a/cinelerra-5.1/cinelerra/ffmpeg.C +++ b/cinelerra-5.1/cinelerra/ffmpeg.C @@ -21,6 +21,7 @@ #include "file.h" #include "ffmpeg.h" #include "indexfile.h" +#include "interlacemodes.h" #include "libdv.h" #include "libmjpeg.h" #include "mainerror.h" @@ -725,6 +726,8 @@ FFVideoStream::FFVideoStream(FFMPEG *ffmpeg, AVStream *strm, int idx, int fidx) frame_rate = 0; aspect_ratio = 0; length = 0; + interlaced = 0; + top_field_first = 0; } FFVideoStream::~FFVideoStream() @@ -822,6 +825,10 @@ int FFVideoStream::encode(VFrame *vframe) int FFVideoStream::encode_frame(AVPacket *pkt, AVFrame *frame, int &got_packet) { + if( frame ) { + frame->interlaced_frame = interlaced; + frame->top_field_first = top_field_first; + } int ret = avcodec_encode_video2(st->codec, pkt, frame, &got_packet); if( ret < 0 ) { ff_err(ret, "FFVideoStream::encode_frame: encode video failed\n"); @@ -1172,7 +1179,7 @@ AVRational FFMPEG::to_sample_aspect_ratio(Asset *asset) int width = 1000000, height = width * sample_aspect + 0.5; float w, h; MWindow::create_aspect_ratio(w, h, width, height); - return (AVRational){(int)h, (int)w}; + return (AVRational){(int)w, (int)h}; #else // square pixels return (AVRational){1, 1}; @@ -1245,20 +1252,38 @@ int FFMPEG::get_codec(char *codec, const char *path, const char *spec) int FFMPEG::get_file_format() { - int ret = 0; + char audio_muxer[BCSTRLEN], video_muxer[BCSTRLEN]; char audio_format[BCSTRLEN], video_format[BCSTRLEN]; - file_format[0] = audio_format[0] = video_format[0] = 0; + audio_muxer[0] = audio_format[0] = 0; + video_muxer[0] = video_format[0] = 0; Asset *asset = file_base->asset; - if( !ret && asset->audio_data ) - ret = get_format(audio_format, "audio", asset->acodec); - if( !ret && asset->video_data ) - ret = get_format(video_format, "video", asset->vcodec); - if( !ret && !audio_format[0] && !video_format[0] ) + int ret = asset ? 0 : 1; + if( !ret && asset->audio_data ) { + if( !(ret=get_format(audio_format, "audio", asset->acodec)) ) { + if( get_format(audio_muxer, "format", audio_format) ) { + strcpy(audio_muxer, audio_format); + audio_format[0] = 0; + } + } + } + if( !ret && asset->video_data ) { + if( !(ret=get_format(video_format, "video", asset->vcodec)) ) { + if( get_format(video_muxer, "format", video_format) ) { + strcpy(video_muxer, video_format); + video_format[0] = 0; + } + } + } + if( !ret && !audio_muxer[0] && !video_muxer[0] ) ret = 1; + if( !ret && audio_muxer[0] && video_muxer[0] && + strcmp(audio_muxer, video_muxer) ) ret = -1; if( !ret && audio_format[0] && video_format[0] && strcmp(audio_format, video_format) ) ret = -1; if( !ret ) - strcpy(file_format, audio_format[0] ? audio_format : video_format); + strcpy(file_format, !audio_format[0] && !video_format[0] ? + (audio_muxer[0] ? audio_muxer : video_muxer) : + (audio_format[0] ? audio_format : video_format)); return ret; } @@ -1266,7 +1291,7 @@ int FFMPEG::scan_option_line(char *cp, char *tag, char *val) { while( *cp == ' ' || *cp == '\t' ) ++cp; char *bp = cp; - while( *cp && *cp != ' ' && *cp != '\t' && *cp != '=' ) ++cp; + while( *cp && *cp != ' ' && *cp != '\t' && *cp != '=' && *cp != '\n' ) ++cp; int len = cp - bp; if( !len || len > BCSTRLEN-1 ) return 1; while( bp < cp ) *tag++ = *bp++; @@ -1287,7 +1312,7 @@ int FFMPEG::load_defaults(const char *path, const char *type, char *codec, char *codec_options, int len) { char default_file[BCTEXTLEN]; - FFMPEG::set_option_path(default_file, "%s/%s.dfl", path, type); + set_option_path(default_file, "%s/%s.dfl", path, type); FILE *fp = fopen(default_file,"r"); if( !fp ) return 1; fgets(codec, BCSTRLEN, fp); @@ -1299,14 +1324,15 @@ int FFMPEG::load_defaults(const char *path, const char *type, codec_options += n; len -= n; } fclose(fp); - FFMPEG::set_option_path(default_file, "%s/%s", path, codec); - return FFMPEG::load_options(default_file, codec_options, len); + set_option_path(default_file, "%s/%s", path, codec); + return load_options(default_file, codec_options, len); } void FFMPEG::set_asset_format(Asset *asset, const char *text) { if( asset->format != FILE_FFMPEG ) return; - strcpy(asset->fformat, text); + if( text != asset->fformat ) + strcpy(asset->fformat, text); if( !asset->ff_audio_options[0] ) { asset->audio_data = !load_defaults("audio", text, asset->acodec, asset->ff_audio_options, sizeof(asset->ff_audio_options)); @@ -1347,11 +1373,18 @@ int FFMPEG::get_encoder(FILE *fp, return 0; } -int FFMPEG::read_options(const char *options, AVDictionary *&opts) +int FFMPEG::read_options(const char *options, AVDictionary *&opts, int skip) { FILE *fp = fopen(options,"r"); if( !fp ) return 1; - int ret = read_options(fp, options, opts); + int ret = 0; + while( !ret && --skip >= 0 ) { + int ch = getc(fp); + while( ch >= 0 && ch != '\n' ) ch = getc(fp); + if( ch < 0 ) ret = 1; + } + if( !ret ) + ret = read_options(fp, options, opts); fclose(fp); return ret; } @@ -1373,7 +1406,6 @@ int FFMPEG::read_options(FILE *fp, const char *options, AVDictionary *&opts) char line[BCTEXTLEN]; while( !ret && fgets(line, sizeof(line), fp) ) { line[sizeof(line)-1] = 0; - ++no; if( line[0] == '#' ) continue; if( line[0] == '\n' ) continue; char key[BCSTRLEN], val[BCTEXTLEN]; @@ -1678,7 +1710,10 @@ int FFMPEG::init_encoder(const char *filename) } ff_lock("FFMPEG::init_encoder"); av_register_all(); - avformat_alloc_output_context2(&fmt_ctx, 0, file_format, filename); + char format[BCSTRLEN]; + if( get_format(format, "format", file_format) ) + strcpy(format, file_format); + avformat_alloc_output_context2(&fmt_ctx, 0, format, filename); if( !fmt_ctx ) { eprintf(_("failed: %s\n"), filename); ret = 1; @@ -1836,6 +1871,9 @@ int FFMPEG::open_encoder(const char *type, const char *spec) ctx->time_base = (AVRational) { frame_rate.den, frame_rate.num }; st->time_base = ctx->time_base; vid->writing = -1; + vid->interlaced = asset->interlace_mode == ILACE_MODE_TOP_FIRST || + asset->interlace_mode == ILACE_MODE_BOTTOM_FIRST ? 1 : 0; + vid->top_field_first = asset->interlace_mode == ILACE_MODE_TOP_FIRST ? 1 : 0; break; } default: eprintf(_("not audio/video, %s:%s\n"), codec_name, filename); @@ -1985,17 +2023,51 @@ int FFMPEG::encode_activate() return -1; } + int prog_id = 1; + AVProgram *prog = av_new_program(fmt_ctx, prog_id); + for( int i=0; i< ffvideo.size(); ++i ) + av_program_add_stream_index(fmt_ctx, prog_id, ffvideo[i]->fidx); + for( int i=0; i< ffaudio.size(); ++i ) + av_program_add_stream_index(fmt_ctx, prog_id, ffaudio[i]->fidx); + int pi = fmt_ctx->nb_programs; + while( --pi >= 0 && fmt_ctx->programs[pi]->id != prog_id ); + AVDictionary **meta = &prog->metadata; + av_dict_set(meta, "service_provider", "cin5", 0); + const char *path = fmt_ctx->filename, *bp = strrchr(path,'/'); + if( bp ) path = bp + 1; + av_dict_set(meta, "title", path, 0); + + if( ffaudio.size() ) { + const char *ep = getenv("CIN_AUDIO_LANG"), *lp = 0; + if( !ep && (lp=getenv("LANG")) ) { // some are guesses + static struct { const char lc[3], lng[4]; } lcode[] = { + { "en", "eng" }, { "de", "ger" }, { "es", "spa" }, + { "eu", "bas" }, { "fr", "fre" }, { "el", "gre" }, + { "hi", "hin" }, { "it", "ita" }, { "ja", "jap" }, + { "ko", "kor" }, { "du", "dut" }, { "pl", "pol" }, + { "pt", "por" }, { "ru", "rus" }, { "sl", "slv" }, + { "uk", "ukr" }, { "vi", "vie" }, { "zh", "chi" }, + }; + for( int i=sizeof(lcode)/sizeof(lcode[0]); --i>=0 && !ep; ) + if( !strncmp(lcode[i].lc,lp,2) ) ep = lcode[i].lng; + } + char lang[4]; + strncpy(lang,ep,3); lang[3] = 0; + AVStream *st = ffaudio[0]->st; + av_dict_set(&st->metadata,"language",lang,0); + } + AVDictionary *fopts = 0; char option_path[BCTEXTLEN]; set_option_path(option_path, "format/%s", file_format); - read_options(option_path, fopts); + read_options(option_path, fopts, 1); ret = avformat_write_header(fmt_ctx, &fopts); - av_dict_free(&fopts); if( ret < 0 ) { ff_err(ret, "FFMPEG::encode_activate: write header failed %s\n", fmt_ctx->filename); return -1; } + av_dict_free(&fopts); encoding = 1; } return encoding; diff --git a/cinelerra-5.1/cinelerra/ffmpeg.h b/cinelerra-5.1/cinelerra/ffmpeg.h index 91ad65a6..f665fa92 100644 --- a/cinelerra-5.1/cinelerra/ffmpeg.h +++ b/cinelerra-5.1/cinelerra/ffmpeg.h @@ -243,9 +243,8 @@ public: int64_t length; float aspect_ratio; - uint8_t *pkt_bfr; - int pkt_bfr_sz; - int64_t start_pts; + int interlaced; + int top_field_first; }; class FFMPEG : public Thread { @@ -272,7 +271,7 @@ public: char *format, char *codec, char *bsfilter, char *bsargs); int get_encoder(FILE *fp, char *format, char *codec, char *bsfilter, char *bsargs); - int read_options(const char *options, AVDictionary *&opts); + int read_options(const char *options, AVDictionary *&opts, int skip=0); int scan_options(const char *options, AVDictionary *&opts, AVStream *st); int read_options(FILE *fp, const char *options, AVDictionary *&opts); int load_options(const char *options, AVDictionary *&opts); diff --git a/cinelerra-5.1/cinelerra/fileffmpeg.C b/cinelerra-5.1/cinelerra/fileffmpeg.C index 4d7c713b..e99732b3 100644 --- a/cinelerra-5.1/cinelerra/fileffmpeg.C +++ b/cinelerra-5.1/cinelerra/fileffmpeg.C @@ -502,6 +502,7 @@ int FFMPEGConfigAudioPopup::handle_event() FFMPEG::load_options(option_path, asset->ff_audio_options, sizeof(asset->ff_audio_options)); popup->audio_options->update(asset->ff_audio_options); + popup->audio_options->set_text_row(0); char value[BCTEXTLEN]; if( !FileFFMPEG::get_ff_option("cin_bitrate", asset->ff_audio_options, value) ) @@ -663,6 +664,7 @@ int FFMPEGConfigVideoPopup::handle_event() FFMPEG::load_options(option_path, asset->ff_video_options, sizeof(asset->ff_video_options)); popup->video_options->update(asset->ff_video_options); + popup->video_options->set_text_row(0); char value[BCTEXTLEN]; if( !FileFFMPEG::get_ff_option("cin_quality", asset->ff_video_options, value) ) { diff --git a/cinelerra-5.1/cinelerra/new.C b/cinelerra-5.1/cinelerra/new.C index fce4c09f..949de932 100644 --- a/cinelerra-5.1/cinelerra/new.C +++ b/cinelerra-5.1/cinelerra/new.C @@ -49,9 +49,8 @@ #include -#define WIDTH 600 -#define HEIGHT 400 - +#define WIDTH 640 +#define HEIGHT 425 New::New(MWindow *mwindow) : BC_MenuItem(_("New Project..."), "n", 'n') @@ -163,8 +162,8 @@ BC_Window* NewThread::new_gui() load_defaults(); mwindow->gui->lock_window("NewThread::new_gui"); - int x = mwindow->gui->get_abs_cursor_x(0) - WIDTH / 2; - int y = mwindow->gui->get_abs_cursor_y(0) - HEIGHT / 2; + int x = mwindow->gui->get_pop_cursor_x(0); + int y = mwindow->gui->get_pop_cursor_y(0); nwindow = new NewWindow(mwindow, this, x, y); nwindow->create_objects(); @@ -177,6 +176,7 @@ BC_Window* NewThread::new_gui() void NewThread::handle_close_event(int result) { + if( !new_project->new_edl ) return; new_project->new_edl->save_defaults(mwindow->defaults); mwindow->defaults->save(); @@ -227,16 +227,8 @@ int NewThread::update_aspect() NewWindow::NewWindow(MWindow *mwindow, NewThread *new_thread, int x, int y) - : BC_Window(_(_(PROGRAM_NAME ": New Project")), - x, - y, - WIDTH, - HEIGHT, - -1, - -1, - 0, - 0, - 1) + : BC_Window(_(PROGRAM_NAME ": New Project"), x, y, WIDTH, HEIGHT, + -1, -1, 0, 0, 1) { this->mwindow = mwindow; this->new_thread = new_thread; @@ -306,7 +298,7 @@ void NewWindow::create_objects() y += 30; x1 = x; add_subwindow(new BC_Title(x1, y, _("Tracks:"))); - x1 += 100; + x1 += 115; add_subwindow(vtracks = new NewVTracks(this, "", x1, y)); x1 += vtracks->get_w(); add_subwindow(new NewVTracksTumbler(this, x1, y)); @@ -321,7 +313,7 @@ void NewWindow::create_objects() // y += vchannels->get_h() + 5; x1 = x; add_subwindow(new BC_Title(x1, y, _("Framerate:"))); - x1 += 100; + x1 += 115; add_subwindow(frame_rate = new NewFrameRate(this, "", x1, y)); x1 += frame_rate->get_w(); add_subwindow(new FrameRatePulldown(mwindow, frame_rate, x1, y)); @@ -347,7 +339,7 @@ void NewWindow::create_objects() x1 = x; add_subwindow(new BC_Title(x1, y, _("Canvas size:"))); - x1 += 100; + x1 += 115; add_subwindow(output_w_text = new NewOutputW(this, x1, y)); x1 += output_w_text->get_w() + 2; add_subwindow(new BC_Title(x1, y, "x")); @@ -360,13 +352,13 @@ void NewWindow::create_objects() output_h_text, x1, y)); - x1 += pulldown->get_w() + 5; + x1 += pulldown->get_w() + 10; add_subwindow(new NewSwapExtents(mwindow, this, x1, y)); y += output_h_text->get_h() + 5; x1 = x; add_subwindow(new BC_Title(x1, y, _("Aspect ratio:"))); - x1 += 100; + x1 += 115; add_subwindow(aspect_w_text = new NewAspectW(this, "", x1, y)); x1 += aspect_w_text->get_w() + 2; add_subwindow(new BC_Title(x1, y, ":")); @@ -383,25 +375,23 @@ void NewWindow::create_objects() y += aspect_w_text->get_h() + 5; add_subwindow(new NewAspectAuto(this, x1, y)); y += 40; - add_subwindow(new BC_Title(x, y, _("Color model:"))); - add_subwindow(textbox = new BC_TextBox(x + 100, y, 200, 1, "")); + BC_Title *title; + add_subwindow(title = new BC_Title(x, y, _("Color model:"))); + x1 = x + title->get_w(); + y1 = y; y += title->get_h() + 10; + add_subwindow(title = new BC_Title(x, y, _("Interlace mode:"))); + int x2 = x + title->get_w(); + int y2 = y; y += title->get_h() + 10; + if( x1 < x2 ) x1 = x2; + x1 += 20; + add_subwindow(textbox = new BC_TextBox(x1, y1, 150, 1, "")); add_subwindow(color_model = new ColormodelPulldown(mwindow, - textbox, - &new_edl->session->color_model, - x + 100 + textbox->get_w(), - y)); - y += textbox->get_h() + 5; - - // -------------------- - add_subwindow(new BC_Title(x, y, _("Interlace mode:"))); - add_subwindow(textbox = new BC_TextBox(x + 100, y, 140, 1, "")); + textbox, &new_edl->session->color_model, x1+textbox->get_w(), y1)); + add_subwindow(textbox = new BC_TextBox(x1, y2, 150, 1, "")); add_subwindow(interlace_pulldown = new InterlacemodePulldown(mwindow, - textbox, - &new_edl->session->interlace_mode, + textbox, &new_edl->session->interlace_mode, (ArrayList*)&mwindow->interlace_project_modes, - x + 100 + textbox->get_w(), - y)); - y += textbox->get_h() + 5; + x1+textbox->get_w(), y2)); add_subwindow(new BC_OKButton(this, mwindow->theme->get_image_set("new_ok_images"))); diff --git a/cinelerra-5.1/cinelerra/render.C b/cinelerra-5.1/cinelerra/render.C index 1f76a92a..d6db3811 100644 --- a/cinelerra-5.1/cinelerra/render.C +++ b/cinelerra-5.1/cinelerra/render.C @@ -336,13 +336,10 @@ BC_Window* Render::new_gui() if(!asset) asset = new Asset; load_defaults(asset); check_asset(mwindow->edl, *asset); - + int px = mwindow->gui->get_pop_cursor_x(1); + int py = mwindow->gui->get_pop_cursor_y(1); // Get format from user - render_window = new RenderWindow(mwindow, - this, - asset, - mwindow->gui->get_abs_cursor_x(1), - mwindow->gui->get_abs_cursor_y(1)); + render_window = new RenderWindow(mwindow, this, asset, px, py); render_window->create_objects(); } @@ -1108,10 +1105,8 @@ RenderWindow::RenderWindow(MWindow *mwindow, Asset *asset, int x, int y) - : BC_Window(_(PROGRAM_NAME ": Render"), - x - WIDTH / 2, y - HEIGHT / 2, - WIDTH, HEIGHT, WIDTH, HEIGHT, - 0, 0, 1) + : BC_Window(_(PROGRAM_NAME ": Render"), x, y, + WIDTH, HEIGHT, WIDTH, HEIGHT, 0, 0, 1) { this->mwindow = mwindow; this->render = render; diff --git a/cinelerra-5.1/configure.ac b/cinelerra-5.1/configure.ac index 40ac01b3..8f8b3c68 100644 --- a/cinelerra-5.1/configure.ac +++ b/cinelerra-5.1/configure.ac @@ -764,7 +764,7 @@ if test $WANT_X264_HIDEPTH = "yes" ; then echo "x264.cfg_params := --enable-static --bit-depth=10" fi if test $WANT_X265_HIDEPTH = "yes" ; then - echo "x265.cfg_params := -DENABLE_SHARED=no -DHIGH_BIT_DEPTH:BOOL=ON" + echo "x265.cfg_params := -DENABLE_SHARED=no -DHIGH_BIT_DEPTH:BOOL=ON -DMAIN12:BOOL=ON" fi for pkg in $STATIC_PKGS; do echo "static_pkgs += $pkg"; done diff --git a/cinelerra-5.1/ffmpeg/audio/bluray.m2ts b/cinelerra-5.1/ffmpeg/audio/bluray.m2ts index 45fd78be..6408df92 100644 --- a/cinelerra-5.1/ffmpeg/audio/bluray.m2ts +++ b/cinelerra-5.1/ffmpeg/audio/bluray.m2ts @@ -1,4 +1,4 @@ -mpegts ac3 +bluray ac3 id 0x1100 maxrate 9000000 minrate 0 diff --git a/cinelerra-5.1/ffmpeg/format/bluray b/cinelerra-5.1/ffmpeg/format/bluray new file mode 100644 index 00000000..292b00cf --- /dev/null +++ b/cinelerra-5.1/ffmpeg/format/bluray @@ -0,0 +1,7 @@ +mpegts +mpegts_m2ts_mode=2 +mpegts_pmt_start_pid=256 +sdt_period=-1 +packetsize 2048 +muxrate 10080000 +preload 500000 diff --git a/cinelerra-5.1/ffmpeg/plugin.opts b/cinelerra-5.1/ffmpeg/plugin.opts index 8e3012b9..f24dccd8 100644 --- a/cinelerra-5.1/ffmpeg/plugin.opts +++ b/cinelerra-5.1/ffmpeg/plugin.opts @@ -156,6 +156,7 @@ swapuv #tblend #telecine #testsrc +#testsrc2 #thumbnail #tile #tinterlace diff --git a/cinelerra-5.1/ffmpeg/video/avc422.m2ts b/cinelerra-5.1/ffmpeg/video/avc422.m2ts index a388e6f3..4271cd62 100644 --- a/cinelerra-5.1/ffmpeg/video/avc422.m2ts +++ b/cinelerra-5.1/ffmpeg/video/avc422.m2ts @@ -1,8 +1,15 @@ -mpegts libx264 +bluray libx264 +bluray-compat=1 id=0x1011 +level=41 +bf=2 +refs=3 +color_range=mpeg +colorspace=bt709 +color_trc=bt709 +color_primaries=bt709 profile=high422 -pixel_format=yuv422p -level=3.0 preset=medium -bluray-compat=1 +pixel_format=yuv422p +flags=+cgop x264opts keyint=25:min-keyint=4:qpmin=3:qpmax=33:qp_step=4:merange=8 diff --git a/cinelerra-5.1/ffmpeg/video/bluray.m2ts b/cinelerra-5.1/ffmpeg/video/bluray.m2ts index d484e8ec..51112c9c 100644 --- a/cinelerra-5.1/ffmpeg/video/bluray.m2ts +++ b/cinelerra-5.1/ffmpeg/video/bluray.m2ts @@ -1,8 +1,15 @@ -mpegts libx264 +bluray libx264 +bluray-compat=1 id=0x1011 +level=41 +bf=2 +refs=3 +color_range=mpeg +colorspace=bt709 +color_trc=bt709 +color_primaries=bt709 profile=high -level=3.0 preset=medium -bluray-compat=1 +flags=+cgop # must be last for bdcreate.C x264opts keyint=25:min-keyint=4:qpmin=3:qpmax=33:qp_step=4:merange=8 diff --git a/cinelerra-5.1/ffmpeg/video/bluray_lo.m2ts b/cinelerra-5.1/ffmpeg/video/bluray_lo.m2ts index 90de1b93..68c42545 100644 --- a/cinelerra-5.1/ffmpeg/video/bluray_lo.m2ts +++ b/cinelerra-5.1/ffmpeg/video/bluray_lo.m2ts @@ -1,7 +1,14 @@ -mpegts libx264 +bluray libx264 +bluray-compat=1 id=0x1011 +level=41 +bf=2 +refs=3 +color_range=mpeg +colorspace=bt709 +color_trc=bt709 +color_primaries=bt709 profile=baseline -level=3.0 preset=medium -bluray-compat=1 +flags=+cgop x264opts keyint=25:min-keyint=4:qpmin=3:qpmax=33:qp_step=4:merange=8 diff --git a/cinelerra-5.1/ffmpeg/video/h265-12bit.mp4 b/cinelerra-5.1/ffmpeg/video/h265-12bit.mp4 new file mode 100644 index 00000000..3d42dbb8 --- /dev/null +++ b/cinelerra-5.1/ffmpeg/video/h265-12bit.mp4 @@ -0,0 +1,9 @@ +mp4 libx265 +# only works in build cinx hi-depth build +strict=-2 +colorspace=bt2020_cl +color_primaries=bt2020 +color_trc=bt2020_12bit +pixel_format=yuv422p12 +x265-params=output-depth=12 + diff --git a/cinelerra-5.1/ffmpeg/video/h265.mp4 b/cinelerra-5.1/ffmpeg/video/h265-hi.mp4 similarity index 66% rename from cinelerra-5.1/ffmpeg/video/h265.mp4 rename to cinelerra-5.1/ffmpeg/video/h265-hi.mp4 index d045e233..8e2a09d6 100644 --- a/cinelerra-5.1/ffmpeg/video/h265.mp4 +++ b/cinelerra-5.1/ffmpeg/video/h265-hi.mp4 @@ -1 +1,2 @@ mp4 libx265 +crf=5 diff --git a/cinelerra-5.1/ffmpeg/video/h265-lo.mp4 b/cinelerra-5.1/ffmpeg/video/h265-lo.mp4 new file mode 100644 index 00000000..1bbf933d --- /dev/null +++ b/cinelerra-5.1/ffmpeg/video/h265-lo.mp4 @@ -0,0 +1,3 @@ +mp4 libx265 +# lossy but faster +crf=25 diff --git a/cinelerra-5.1/ffmpeg/video/h265-med.mp4 b/cinelerra-5.1/ffmpeg/video/h265-med.mp4 new file mode 100644 index 00000000..b8b93753 --- /dev/null +++ b/cinelerra-5.1/ffmpeg/video/h265-med.mp4 @@ -0,0 +1,3 @@ +mp4 libx265 +# visually lossless +crf=18 diff --git a/cinelerra-5.1/ffmpeg/video/hevc422p10.m2ts b/cinelerra-5.1/ffmpeg/video/hevc422p10.m2ts index effb81a5..f15e594a 100644 --- a/cinelerra-5.1/ffmpeg/video/hevc422p10.m2ts +++ b/cinelerra-5.1/ffmpeg/video/hevc422p10.m2ts @@ -1,9 +1,8 @@ -mpegts libx265 -loglevel=debug +bluray libx265 id=0x1011 #preset=ultrafast,superfast,veryfast,faster,fast, #preset=medium,slow,slower,veryslow,placebo preset=medium #tune=psnr,ssim,grain,zerolatency,fastdecode pixel_format=yuv422p10 -x265_opts=output-depth=10 +x265_opts=profile=main10:output-depth=10 diff --git a/cinelerra-5.1/ffmpeg/video/hevc422p8.m2ts b/cinelerra-5.1/ffmpeg/video/hevc422p8.m2ts index 0496a829..90f7c11b 100644 --- a/cinelerra-5.1/ffmpeg/video/hevc422p8.m2ts +++ b/cinelerra-5.1/ffmpeg/video/hevc422p8.m2ts @@ -1,9 +1,8 @@ mpegts libx265 -loglevel=debug id=0x1011 #preset=ultrafast,superfast,veryfast,faster,fast, #preset=medium,slow,slower,veryslow,placebo preset=medium #tune=psnr,ssim,grain,zerolatency,fastdecode pixel_format=yuv422p -x265_opts=output-depth=8 +x265_opts=profile=main:output-depth=8 diff --git a/cinelerra-5.1/ffmpeg/video/lossless.m2ts b/cinelerra-5.1/ffmpeg/video/lossless.m2ts index 8ba87569..316ad72b 100644 --- a/cinelerra-5.1/ffmpeg/video/lossless.m2ts +++ b/cinelerra-5.1/ffmpeg/video/lossless.m2ts @@ -1,2 +1,4 @@ mpegts libx264 +cin_bitrate=0 +cin_quality=0 qp=0 diff --git a/cinelerra-5.1/ffmpeg/video/visually_lossless.m2ts b/cinelerra-5.1/ffmpeg/video/visually_lossless.m2ts new file mode 100644 index 00000000..db41439c --- /dev/null +++ b/cinelerra-5.1/ffmpeg/video/visually_lossless.m2ts @@ -0,0 +1,19 @@ +bluray libx264 +bluray-compat=1 +id=0x1011 +crf=18 +maxrate=20000000 +bufsize=20000000 +cin_bitrate=20000000 +cin_quality=0 +preset=medium +level=41 +bf=2 +refs=3 +color_range=mpeg +colorspace=bt709 +color_trc=bt709 +color_primaries=bt709 +flags=+cgop +# must be last for bdcreate.C +x264opts keyint=25:min-keyint=4:qpmin=3:qpmax=33:qp_step=4:merange=8 diff --git a/cinelerra-5.1/guicast/bcfilebox.C b/cinelerra-5.1/guicast/bcfilebox.C index 7baaedb3..7d52d98c 100644 --- a/cinelerra-5.1/guicast/bcfilebox.C +++ b/cinelerra-5.1/guicast/bcfilebox.C @@ -215,7 +215,7 @@ int BC_FileBoxDirectoryText::handle_event() while( *cp ) ++cp; if( cp > path && *--cp != '/' ) return 0; char *file_path = FileSystem::basepath(path); - char *dir_path = FileSystem::basepath(filebox->fs->get_current_dir()); + char *dir_path = FileSystem::basepath(filebox->directory); int ret = !strcmp(file_path, dir_path) ? 0 : 1; if( ret ) { strcpy(filebox->directory, file_path); @@ -497,7 +497,7 @@ BC_FileBox::BC_FileBox(int x, int y, const char *init_path, this->want_directory = want_directory; if(show_all_files) fs->set_show_all(); fs->complete_path(this->current_path); - fs->complete_path(this->submitted_path); + strcpy(this->submitted_path, this->current_path); fs->extract_dir(directory, this->current_path); fs->extract_name(filename, this->current_path); @@ -535,16 +535,12 @@ BC_FileBox::BC_FileBox(int x, int y, const char *init_path, // Test if current directory exists if(!fs->is_dir(directory)) { - sprintf(this->current_path, "~"); - fs->complete_path(this->current_path); - fs->set_current_dir(this->current_path); -// fs->update(this->current_path); - strcpy(directory, fs->get_current_dir()); + sprintf(directory, "~"); + fs->complete_path(directory); + strcpy(current_path,directory); filename[0] = 0; } - else - fs->set_current_dir(this->directory); - + fs->set_current_dir(directory); if(h_padding == -1) { @@ -592,10 +588,6 @@ void BC_FileBox::create_objects() fs->set_filter(get_resources()->filebox_filter); } - fs->set_sort_order(sort_order); - fs->set_sort_field(column_type[sort_column]); - fs->update(directory); - create_icons(); create_tables(); @@ -653,8 +645,12 @@ void BC_FileBox::create_objects() if( newest >= 0 ) { strcpy(directory, resources->filebox_history[newest].path); fs->change_dir(directory, 0); + strcpy(directory, fs->get_current_dir()); directory_title->update(fs->get_current_dir()); } + fs->set_sort_order(sort_order); + fs->set_sort_field(column_type[sort_column]); + fs->update(directory); // Create recent dir list create_history(); @@ -678,7 +674,7 @@ void BC_FileBox::create_objects() rename_thread = new BC_RenameThread(this); - + refresh(); show_window(); } diff --git a/cinelerra-5.1/guicast/bctextbox.C b/cinelerra-5.1/guicast/bctextbox.C index c76f67ef..5a9cac03 100644 --- a/cinelerra-5.1/guicast/bctextbox.C +++ b/cinelerra-5.1/guicast/bctextbox.C @@ -766,6 +766,8 @@ void BC_TextBox::draw(int flush) draw_wtext(text_x, k + text_ascent, wtext_row, len, 0, &positions[wtext_row - wtext]); } + else + positions[wtext_row - wtext] = 0; // Get ibeam location if(ibeam_letter >= row_begin && ibeam_letter <= row_end) { @@ -778,14 +780,8 @@ void BC_TextBox::draw(int flush) //printf("BC_TextBox::draw 3 %d\n", ibeam_y); if(need_ibeam) { - if( wtext_len == 0 ) { - ibeam_x = 0; - ibeam_y = 0; - } - else { - ibeam_x = -1; - ibeam_y = -1; - } +// ibeam_x = ibeam_y = !wtext_len ? 0 : -1; + ibeam_x = 0; ibeam_y = k - text_y; } //printf("BC_TextBox::draw 4 %d\n", ibeam_y); @@ -1853,9 +1849,8 @@ void BC_TextBox::get_ibeam_position(int &x, int &y) { int i, row_begin, row_end; int wtext_len = wtext_update(); + x = y = 0; - y = 0; - x = 0; for( i=0; iadd_subwindow(yscroll = new BC_ScrollTextBoxYScroll(this)); text->yscroll = yscroll; yscroll->bound_to = text; - + set_text_row(0); } int BC_ScrollTextBox::handle_event() diff --git a/cinelerra-5.1/guicast/bcwindowbase.C b/cinelerra-5.1/guicast/bcwindowbase.C index 75e37fb4..7d4fa2b5 100644 --- a/cinelerra-5.1/guicast/bcwindowbase.C +++ b/cinelerra-5.1/guicast/bcwindowbase.C @@ -2886,27 +2886,21 @@ int BC_WindowBase::get_text_width(int font, const char *text, int length) int BC_WindowBase::get_text_width(int font, const wchar_t *text, int length) { - int i, j, w = 0, line_w = 0; - - if(length < 0) length = wcslen(text); - - for(i = 0, j = 0; i <= length; i++) - { - line_w = 0; - if(text[i] == '\n') - { - line_w = get_single_text_width(font, &text[j], i - j); - j = i + 1; + int i, j, w = 0; + if( length < 0 ) length = wcslen(text); + + for( i=j=0; i j ) { + int lw = get_single_text_width(font, &text[j], i-j); + if( w < lw ) w = lw; } - else - if(text[i] == 0) - line_w = get_single_text_width(font, &text[j], length - j); - - if(line_w > w) w = line_w; + j = i + 1; + } + if( j < length ) { + int lw = get_single_text_width(font, &text[j], length-j); + if( w < lw ) w = lw; } - - if(i > length && w == 0) - w = get_single_text_width(font, text, length); return w; } @@ -3696,6 +3690,26 @@ int BC_WindowBase::get_abs_cursor_y(int lock_window) return abs_y; } +int BC_WindowBase::get_pop_cursor_x(int lock_window) +{ + int margin = 100; + int px = get_abs_cursor_x(lock_window); + if( px < margin ) px = margin; + int wd = get_screen_w(lock_window,-1) - margin; + if( px > wd ) px = wd; + return px; +} + +int BC_WindowBase::get_pop_cursor_y(int lock_window) +{ + int margin = 100; + int py = get_abs_cursor_y(lock_window); + if( py < margin ) py = margin; + int ht = get_screen_h(lock_window,-1) - margin; + if( py > ht ) py = ht; + return py; +} + int BC_WindowBase::match_window(Window win) { if (this->win == win) return 1; diff --git a/cinelerra-5.1/guicast/bcwindowbase.h b/cinelerra-5.1/guicast/bcwindowbase.h index 2acfe5c3..4136b110 100644 --- a/cinelerra-5.1/guicast/bcwindowbase.h +++ b/cinelerra-5.1/guicast/bcwindowbase.h @@ -281,6 +281,8 @@ public: // Get current position int get_abs_cursor_x(int lock_window); int get_abs_cursor_y(int lock_window); + int get_pop_cursor_x(int lock_window); + int get_pop_cursor_y(int lock_window); int get_relative_cursor_x(); int get_relative_cursor_y(); void get_root_coordinates(int x, int y, int *abs_x, int *abs_y); diff --git a/cinelerra-5.1/plugins/theme_blond/data/new_bg.png b/cinelerra-5.1/plugins/theme_blond/data/new_bg.png index 43b75778496d688e9740c30947bca0b3f3c33460..7a47887ee8445d90be36c6441c30b4b50926dd38 100644 GIT binary patch literal 3349 zcmeHKX;f2Z8h%5NPVDJMK&QQvd#Bh3LNaeo|%7>Ke^nz-@81|^FH^I z;pMSiTf;~L0JPn{bo~lIg#e&jQddKFOw!Vs=*xifg&${k6elJek~op!vEjj?F$dUT z7IEx|?guqTP{b-6;kuU-4!a{0=sWhZ>DCOomA#{_gQJZV-P+P>lSYca<3!sFw^!|0)jbg#(7n3$+|@u!a}0JNgqT(|5#oZsKw$_{AxDD79C+3@O? zIGUP~y8J*P?Pb*sdc{wE%k%U%7F$PFQC*$0yV#kbQ~R~Gj*b?sHE{WR@z|>5Ddhnn zz;P?5F$%!pAQe5Je-Emlz6L1pOTOo|;di~oxw6rZhc0J5_N(g4W0_KWe%`6p6T=Wx z-AyT9pYvU6PV~jXhm(h1ZH4^&7MOGwbg0sYthE~|JRvTZ+pGzC+du`rTS@@zRiy*d zkfQ$oTYm}(hnd%1TeTZTj8%L1BUFu^07Qg+wsIsdxL{-hq};R5Zgx?Tww%_Ib}41? z1ymp+dRH)ku$-sWW?ZXhGA8Kgr&5}zqeSGx$|{`E+1T03{cC0Y;I}gZ-n&XsiH~q> zA}~vKUcV^iB&FKF^kqYH*E8qVmLFv|qZv+ukN>NmQQ(*s?gk`E*Q0*7= zZiXxM^0sS>W@y>1+$Z`vND*Tgy=fr2vb&ubZ z{;jcBbnWuaC=`u-V*emTQsr2Je*TXgO-T<*`wmu?p`<~9Q|B2H_s`g-e4Z__IV=6h zblBtSa*6ItnPj3*{B=;r`01v!UCQb`ca;+oUwz%c*t9t9Y_vo0 zstGfA=nm5%LXr3?FF-J&IIt-#^<+Z)M43TECW_|sJ|qTLLt*{BCh^r2-{qN^Ms1-- zPb%*F4G#Xhqp|mwjU1`lt~Iy9>K-b(rxF6qH|{s1UU{^;|BXa^b;dW)qFk$$=5Y$R z+q$|hxNvJOwVtQ7Jo-m$6<>Lf7m#Cd4A$)cm&#_Dn30ztG+5s3qA_IBq5B3E$c)eV zoVc?F_&p8pu9RdoHApig*Xqg?+&z`2P0vfChIjRSIWSP3m7con%|y?e)?*+4Dver7 zY`^U<$dmj{lv^JCbf0B@DN6l~q}gBQi&9H{M~3e#&3atR9xU%u3O0#4W3ze29$x!} zS0?%^_)7-|8tVFFo+(13w2}_=3vr7v;hy#Q?QaQ`!(o!{3#eRQTgaZ;dPO55Uge)1 zFQ>XC{^AEqYUm>)iRL#?DJ{ziYt}(9(a+u$PzbNJEquzed8#g*gH_6d=1r+NEKyBK z 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 diff --git a/cinelerra-5.1/plugins/theme_blue/data/new_bg.png b/cinelerra-5.1/plugins/theme_blue/data/new_bg.png index a5269f579b91dc67aa12e1eb80cdb1298d9464da..0d24e024178f35fe684f94f2f313563389ef4bb5 100644 GIT binary patch literal 3854 zcmeHJdpuO@8vbTXlO&X4cAHEmC(ceHwse_jZ=oHc6q0*W5)p=s+jQ5FYUgy@l1_JI zM2*H}qEsrCU5&dz3L6=>W*B4G-@A0q+2`#2*ZKXH$ujn2*YK<>*BGRW_bNxJv2J?cvEgFjs&-&)Hz31J(q|7qQ`B~rAJm+%TcVTZryo#dQADvM?+@^Pr z?>u`>-jf2;vwyQ!9Q0o*TV^&~wcOZPZT|4sQ-{VTvrbuwck+6Ew3gM8rj>p2_)9HA zpJk1DTeT1}-O-bP0jr%u6r{WWkdrS1dzrOyxw{K~k*wAzn~xPx-{>UVpm@ANuj6j; zp>}@{ZJ&fZWAC`Xd$VQ!g3p6b*ph0uEaTpq=0$En4|d;rk>4AExRZX z2#Uhn!$U%SGHZ z-CTKJY@#T!Mc$J=F?MG3;F9r#-jaQV1>T;+sie4J_m&akm8`)I_Q&_rC0)}?w+*cf zf0xIqc*X0asnxmPt-rlm@yn9xnhTn|;`Z3D>VnDr8W$}S zu3X~xN4{!KDA7`zaVQ0EJHQ@%v@@vhbBXlCh&R>Z99pHnbB{n^ylT*9aaFVH`o<*R z08!Lvh~&B5rQ7Ldb~&9MpXe3Wh~i+xi|13wW_FaD+~jN$#7>)Md3d6Qr4=q8532L;S#C zk>1f6!b)zAZfQkMV}+G8Fn(NCRefD_E?dx{-ei43{4%J(awK9M;?}2kinB5jKWq0` zO~_kn6^6l=t;UCzxGK_o=GFB6QuBu0mUpu!BvxB-8`y!5x$V?N*7<%#UP1Qj3qs1H&dh3uu279;tsDodbczIPG z%bkYrX0mF98qPR}>Mft)ffT^Nkq#rSH$@9uv{Hk*HKd|5VrCyl7}n3a36^c@e(G;Bg6uWJqFaDc}{?s)} zDC`U*Jv9yIBF+Xo48*3(xD#LW^C+rFW5*~h5Tb8zvyNT83<)?=15Wl$4v=9j#c|hm zMU#|}O?}1$P;#mq(44)1)7nG1SGENpLwtR@oeTu&Dk-5;%n5p6MHxcQki$Mi9dE7$ zIj(hO>JoYF<5S49q55v|^Q#1EPEm1C7mbF{4|qq_=Z}u5k^GN^P5u{1Exb8{ek) zJTf%Rwt696@+%4|Y`cK~15JL&yH;-XP zTozIZIk}$YkWd>;t)Un9fD%gb2g#jRFgR0pP6l|BN$A-Z`j0TNQcp2!1mUWXn0VB9 z0*do%01U}c_uOR|`1Y zys}>(fUF0@A%F(4*N9jx7_Z-a;{nZwO!3yrAHK1~TN46<55n`u#)-}HA-6+xZC0u; z%*N#gFPy-yghIwlEW`-&EvZyQKY_4H-wN1YU&c2y;kakn)aitEWjo@S(+*7(17NJ$ zD|;!ioK@`RL;}yaT(qTh(vWzi zIw_bJ<0^Nc>88?9^74@wkd7hY7#{I6lK@L~w=4s$=O9nMrSe>yvsC<{2OQR=5RVx> z`Om(%@Mh50JKpG80zsB|D;wS&&2B~LQ5|^1Qz+bnXo@9p@~V51pzdRilTs0F7Od*u z1qg0=q+x*0&wx>R=ES%HV;pB_TW!61asvVLx>sVbY9H8 z9^i}6X?Mu;REANT|tw^4Zu_Ime2At z5~phKhYs9=lJZ|d&*x(B8rNg1)rb)^Ar20(KIOZ5oD=&=C<&TKoz!hC&~qH1Bm|u0LcXSPk~`SUI_+ZXhx`S7tw8pU=kR6c|JZ{@HwDk zO;~MF!{#tN3KyXP*Wn~RMI00wH?p^ckRkpc#9MEMZdzhO{=C;j2OiCTE~y zlMg?#JzOC=H!*6GF@^7Rj=PP!AhfM&@!90jw?2yJp5v=f(>|@_wSv7JwVk1ffrZ`b zeZh-^>KBz#n&|9$9&czueegcflAG!zX}olty}A4!~M?pz^^v&Q^x=R literal 3613 zcmeHK`Bzid7CsO}hN3t;sLU#gwFoLRGKn})3&Z(= zTZAM)v9S~c0$3;_;y@BXrdkydC0IZNlhCs-uGQBcUf25rUe?OZ9roROf8YN0J|~&` z+;^*~XsIBC)Li$tcp)V3kC5D1B}IHE#zOBR{!xf^cJ)!hpOZ@Ar}4FN^qzoNY%hYZ zob!f)czknJ+)n>E@2Ep@%+Qz!#AGr}jzrR8!$PAYOrl~a1><&F*gD_UWxG#&;j00U zGyNk$?XSgV+s5KWmYGF8jKYljP7m&W;brLJ`Q65i&dSuiCcY$opjDx zPX%Td+8i6sIJ?nTvdl-v$-wEfpLB(D?#8Ql>Zj>|3?3fr!S+X z9?Qa60o`)Zosu*1*%ilSmAfff2Ww9z1lB)jh;UrW-(+Li$5~;j-A3BoIjk^tv$NFJ z^QTRdLH4BTs(RJMp%ZoqT33W$UFL9&H=1K9O5_pux*D=^dHD82N}cdwp213CYuvP+w?gi zli&(dS+BlO)%0Y;3rD806+ge%w$XQ~{aabW^X3_mNH+TM^x|NNv@bED%(99z*O9{b zOs0GMkDKKQk{?v3M^&2+{GRA82#*zbC`=`ElN^1T=3Yh#d*6xK1KT9E3XzwKKRorM zzjt!F-@D0^+0Uw6-!8Rit?RRG3~HL_=oXU1C$7GUv^u94nLR(Lf8`bTRl*zZCNCqg zz4!SaJffTHsDc+1z50EWafkhhkJ!mtA-YPO9hQ1gLNiSVasjirA~UC>wNLBIUDKmR z$>o;aM@6#lXSPO%$m8x zgH)b;j-BLQ-OM|2RmTM$_TrH&DbF8tINrTBI)xv2&dBk#4}B=9?v3scqK)-*h|4`r zz8s;7f6O$W7*G)Y`;1i^k$hV(y-C`ll_;)f)ecJeiM07|u?6ep-2)}(jobxg$!~h+ z28P}h^|2x-f}B<@>NUTD#AJ^^UJmPJ=A2}2F`NA^uVVJ%<{RJXJks8DgXtf_eP};2 z&Mjs=)*N$`jScxpH*iWEWs{~pQnqz4FRY;b#i&s+yUJlchn>7KB(qT}p7%0Mex+@Z zz(^RjNM$JWGiADrp;;zpZj1j8*6Tc0VEwx4?6hml#)dn|6X$##6{}rX^SMpsnoTlE zi-@xcp}4~W>S6B`JOiKK`(oyR3Z8sR-0%zx=ZTUUE)%!=_65U0)N3X8FT#DQnFyn} zkJ+eWh))vCN3gXEuOfeTQPFuSI+g|mvxV9Ki)ApbYgpRb9nZq2{yVHy(ElohR zoX95}2db(40G)s8Ovhg3#hQraIr$Mj=Lo5m(W^?p@!iJBrv`Y@xLd-rtX18M^NTw|vRVdiO_pdaLjG&u zVY9;faeougT@~K4!5O$-P{PZ?7dfl`g)fo%KRaPbbI{dNEZO} zoSe;tD;s#JW*00UK%L7#NXk0=(%eP3uxK|&D75oz0CDTTNKE-NVbhP{~kP$=YSGc1wQ`6Ghn(p?};Q;=qjj=2gtE6lIQkiPm9 z-)ISp?KQ*eJkaI&*K0AFSg#j7pa_?MhJZB+Na>o35>lt6;SGnNf2R^U8?jUa@xOwi zxq}e>mqYR$KrOK=F~aVzC@K;a%p(+upQ{UQ`P$%6P??ObnGoGVqOu1qePZx4>|0?;yk&QgC*V3{Ym&%;W+NfuiMtGPu6H-qa{n%!hj^P*}YZN^~By zNpQ0P?Kqw@ga<^r`m^M=6C8#?kJ?=(V9 zeSCU1fF-jpLEGApKF%Pp!?^WaOSs4<&PilqSXu$dfXUcuh;j2rYUM3CbUFsg=0_CI zFBYfacAyey=1!Id?Rqzb$NQ^HSDc=?bKeOXt&{4|E-I z+dbHgPKBD&887RKe@S1#DVQx$S92r<^e@|?lbZ`~ro?Xrw2L3CDTz9&= JR62*G{RvnTVL1Q* diff --git a/cinelerra-5.1/plugins/theme_blue_dot/data/new_bg.png b/cinelerra-5.1/plugins/theme_blue_dot/data/new_bg.png index f36686483497d1ad1c014df96e90deb864753701..aac3a476165faf0f327a49759ea0544bab587431 100644 GIT binary patch literal 5618 zcmeHL`#am``+t&BscI|Cp%W6SwN{Ik5lUjMPS>IB*3bho)M<5yLnso7twXEDwywI; z>S|ZDDAjI`mE-+*=__HAeTz7?!FSyLr+LRR4;YBm`!%_%#4%&Lve&bt-7%L$dP>$Vl+pcA z1g0^Qb8)AjnJ=j}WB13n-jrJ93uZ8USf8fEl3;brK-K+`w{5bkXlEMJ7pxem!E9lCVxjh_5RFmb7?hE6E7`csH=(! zhx^K$eV%Iu16x1*a zp)C8fY`+oPgx)um+BPG2=fp{N0C^=fbxK(7mX3}qvTUExxhsY5Y5buf5>5HOy1zE0 zA)l?4HAMOSJ*(g10G)l*TeDj0df~+Kaz@+Ry~R;4rWfOQ?!mRBy5L&)2U;^kbt{Mw zA_C>z0!z&6Xl`y!$;sKT854N2Yiny^zI!VNMrZWT`y!3cA1m+Qv8j}MdEJ?Ox`P_nT!#hm8(!G6C6(3M`g7#Nni}|aZbn#;zU-U>G!z3!MeQv|$avMXP9w-ss zCJ59>d4G&4o!^t)Q49^bL?Y3vYZ94E_S=-O4$GNDGdUd}O{+FfHjFInsm*PoA%eaI zdby7mlufB)5?BN;NhXzQR!LjdH} zqck%u&GjiCU;N4~FqBO0aj2x3^i6%CMpRfLQ0iSo3q~R@NZNdIcNdnk!Gy^%$l*3g z@Wq3Hd=rLK4yd?090e)* zmG|t_{2v7?>+oCP*_CXbl+1fFCbo=wL+n^UOmw<*K@C_C4XauK4`^Z_O$%O@!0dxtmyS2(w$~Tc)I|P%I;+!wv(=Qz*+1$d=TgJ` zx|Uijpc@u+6Ero#7l{)8fob+gA3Pa&W`#ti>voXWj3LamR;X%)UJyO79R9qf5)B%$ zvI!FV*AeAtf;)swPP(|EtI~=MrUL=ee{*y0mH|yzSXircBgIw^=i<3$_exH83pA}A z>TM-5H`;-`!j*Vov#<>^sBttY%Dp_WIrpY&T?+})z9GRtm;)`LpDq-8- z68TFl!hRdD{bgZ%`jL{mCP3E*rlo2{S}g-u1c3wl3d)F(kS9nV>)(bEF?u-rv=${- zPXCK)4T(u3WG-6ZHXu+Jul8YiB6leCetu8`ATM9J^>1T%0fIRK^?bEfq6~O0CrD;c z;RoH0lgxGCkukIMnTye&f(>&ZR37EAofzP)EwH_qI@uhmEiAkz^ty5PVuU5l8658N zpdW^f2kv=rSppH%#2~Y1p0F>i8;7hc?Sd?l(_tJ-sI<$@pcUo2W-iJ|PSm}OVQm6u zC-)QWkKIzNsB8C)0)Scjio<=3maoq7R+`%Txd%QrrL~? zf`PsCp76~i8JM`P^F`A6N2hgKxq_h+sjAwoCs#2zxnzbO zTyEHi16dnnEgfSYun1Y#HUS4h_8c+s$Mf}ku`D^osX1>r`r6FiF5(W|Wb{me1 z(JDFEe1E?}BCxZIWDO_4RIV>PD=WO-#4NviQ9%=3RS3VwPH*$Pv zQkN&Q_SynqzwkQZcJ?cYXRmH&2)OQmaM+#P6}3sSnScaxAMsgB+AVJFA)`ZeS&0^RH7KY(l! zEw$ZSc-r}qpqVGSBT?xTi

B;CEwN`CF>h#v!?->+l9&f@_%HoTv0 zbAo~a#}Gz-MBxBI6`+^ea9L6Sv6j%xgNpKs3MZRnH8NK4z?C_5^Oxvo&e7kt#I6Aq zKC9yjt2TUS^Np0w=v_`$Ae<(uLqv#*ww=JD=#Wow6#3<&6C_g8_M2wexM*Qq`)H8l zoJ`(-(1j%-D-iXU1%+^8(9n^w5r&+4p|UA)+eGz)=cz5Nm=C9Ohp0Y*=9Bm!27iaK zxO_Er!>@;rIDZnSMoy1E=(v=EDY?`2b{@9LOLyb%CRXjs!~1uwx(k1pNePXA4XZlSqSaBanH6un*m-7sjoQN4H+e zPCqpWx(N-Ukvj)sT=O_t_iJ{+2f+xrs^jq!&T~_y!&mO*)(?g&&qvc&7d=X=bHb|NLLsK4N*B;q5vegS9x)9pergnrvp`K5*U(}z|j zik!QhSu20oBOShO4GnV4gA;IUc0t5LYa?$j#Q8tOpNuLYA43b@(vgW4YnuA%Z4};!;fQG7VEG-C40rfc6=y| z3wy}Y?U_#0oQgousncpVP`(jsaTe$=^|X?c;z~%6T&-fd+j;)@3#@A0yw<$vke?rv z*!Lpj6t}IuN}_^-v&y65NlP+aMv}#0&CmCxwq7o*?4~F_sb9M?46a;RNlCEk5%uPzgR|Me6P-l{w7cX%(9`8=}3z(FPEq%OuBh*OtTlzH0k!f)!!TQQ1UVmJ0 zq>{w$I~MNP6y5+U0(tPJi9T2IH2H+x!@BjXb4FzhgB4HgK7SNvV`|F}l=HCDxs_*|XhXll~f$N7hF^PdyW78^4+V1n!`nqlSAtkFbmmwa}pmSA^PqwkuZCzsl$ zUBEgBE?+GIfWj?!fkqkw+*Sk%lwJmU;P9sa31GWNfFICI0G^|K0rRXL4*2f-*X-Yd z{ELu(x$yr)94ao>3vE=}0ObxLy?A99V0xq;49oG{t9fDFQ_0qq-5#8&m5KX?_3{ruv)ck1t(Cj5Q_FIyzP6y#Tb;Hz)`5Al&c-T(jq literal 4813 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 KnR3Mc@_zw8$NP!^ diff --git a/cinelerra-5.1/plugins/theme_bright/data/new_bg.png b/cinelerra-5.1/plugins/theme_bright/data/new_bg.png index d678a7015e454b0ab45851cb03ca460623be3298..a4b9cb70cb9f3a0edad5e905dd1bdfafa3acc1fb 100644 GIT binary patch literal 2628 zcmeH}YfM{Z7{{M;dZeeMjKfGq!=;>#%i@;J7Rb27*|TvQ$fXk!CX!KL9iSc7wh%6} zJ?sK3V=!Zc&UuR(;&gyaB`9+=hz4RSitvHF;UDPmP(tdTc1vI!&=xSU0#M zp#HauN`6|zsh^+qwP%xzrOhdDT7c>Zcf(VA5H~6LZp3>L*CB3j3aXnCqb)@|gZ3{p zr!GTWLoyPyt1ko9fcA+^jP~1pyj6v3-o+}CSzmP!#?Cqg6D>d;$aWFhr-5vbbVD!3 zM|PTFo#Cw!SapNu?0VF0Q>^ZB)XXH)CteZi!~|V{dK~Imd)&~1Tgbuq&mztqgG~gJ zOxy*;tw8NSJcc+C@t=t0hy$@2ja5QOX5vk!pl=sJFQ&VQ0*qIMxuGi!$bQBQ_fY!| zwHN$(YX>&5ioHi;6JpfPI|Y(PpiCJqqB$8zvn1o?Q`+M}jQHMX(@CauK?I5jTuGa_t5g=OUI1 zNhT8K;#3l}KZ<9PVDSB+P{2cy%T|QeJc`XgcR2*HpBbJ!0)yd*TX*tuT+|v(v0_|x z`NmvTe`l$Zti~DIpMB6G1nyEdPe3un0*8+WH2LuW3X%af1xOg8Ip8HqYC|;8I-D^z zV-tMx@wX=HRvGKAb=j7j5Tq4s$tQd7rEJL`XuEvkJ+j|qevrWk44ofy`glX(f`uqAoB zy8vk*`02d69!PN(ctjR6FmMZkFk^j6{6wH2dx@v7EBkFu8FmqKgLNy80yVz!ba4!+ zxb^mKcjsXT9@oH=KL1s{GZpv@d)VvGX(m3%%s1OG`|e%F4?;5~L!T-(1n16U5C~^r z;&zB(L=YT0427%+LSX}t3nY$+f{BI$Oh-h4gg`ig0Gfbe42KTTK!PS98-v3Hm@zOn zKpg^e1K0$pF)$Ng4uQG>Y=T2fr#3?)YX>sHBBrp80hwsn!6XoYLO3KaKH@?U=q7*- zL^c6vAchHzJD5;Rc*KQn%(FYsIx@~Pd{G>+LC;X4 z-f-X$L6b!&YHK0aymiDQJ7hc}?#2nJ)q|VWDydflfKPKAGG7 z$HScO2mb!JYl`eOkWYcp42%-6PhtKCa*_N`SP?YL@SB9B2pX_hti!GdYB0=A)KLVp z9U25kZbGsSNfFF;V2S{V5>$i~Y#^=JO(InhC_NH130V=XqY`(@!5&K>Q6x8ESA-O{ zplE?A`cR>4yq9TD!&+vYJv&3M&SPXqkc$^&f=Pok5sXBl6wx}Sk>dxos6k2&Br8G+ oRbV2)VG@!eq@X7%5<7k{Y;Bk^|MIIRMW9;J)78&qol`;+02h($ diff --git a/cinelerra-5.1/plugins/theme_hulk/data/new_bg.png b/cinelerra-5.1/plugins/theme_hulk/data/new_bg.png index 10d1dad1b1268e4e8f046e647aea04b881e27f0e..d5485436ecd187cc976702d318fb55aa88c2b6c1 100644 GIT binary patch literal 3922 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 literal 3689 zcmeHKX;f3!7CylNs%5ZMCK1ruM_XmEEEGhHiW4f63Pc116_7!&0gMa+4lOF8wpNfZ zq;)_^A_-`;gi)x7fCGgP0TFFwFibLp05Rd6eR#TFf4uenyq}M?vbZ_-+`acV?0s%d zyEtu9pQS$wA*AlGdHr^TRA>lME~w4KD|9Qv%lO~)h;{a%b_11+QzHKR&N4uQyi!bw+74g#B zw+$aLppPj>-!0S{dNI(YP{d7mOe(iFs37A2+K385@z2zjqC|^hGmzFl_y|>`b}8OX zm@5MhmI(xDA(Y?t)!xt$z2&XG+wG5vpS~z>i4WmqPjog|8AwXJG|LZWggW+I3M?(b zw|gyC@Y(Di?7fdZH(SJ~s$1Dp+`<#H9I_Bp2e z|C|0J1*zfEzxIcC+B=R0nk0xNG|mN}mW;w*U@7i%t7IrK2qd4VThKYV#U?MB(e zbDz9v=#}aZdVgcQ^NFvwyz`QnMZ9?>~PRgP560h3(7FkWB*ZW!~c=MzB zDvAV0`!_n~wR01o|IJ@UcYskhE}D$U#-lDofO}fzf#c?*z>-tohwr+TCSu`KO5QmxlGio zLv`QXUg+AD(3Qdrv$Zk&%}ymG%^>=HcFahvQSM{jo;=26P(*z#WuvF(o;=N?Z*x6u zqOY075B6;^SG6{t-el&vvee6HqT*td^!j6=GJL=+#-^O+EqxZg%DrLh#g?&_>l=78 ztr6bYQ)zEE^w7DfqpXy+yS*sCy90e8-7c;)U*$SbddF2<8s(1@joKU&sHUDX7gr{{ zdo3KR*c~;zAaKt8wE~RRaQx35QEzLzBvp*|-6QnGquYG@e!OJ4Niq`nwCVfy*xNY+ zj@l&#zSk}#oo`HUKU(}Gp}#Do;I&17@A6}UB=>~KTTaS9(pOH(!`;VqKhfY`rIz|= zu9CZWk6pZ{T{72~^%*TTRB=%z&c89h*_!ZOSp8N?f5mB5EdK|6NzDo~^OS1;yk zzj_mKgTvE|k{T_?kG(R>9DnhbVDQfeE%Ez8@FSyo#{|ZK@jam>^79^&lF36_UmNVK z)ihwMQil&@O;)bpoOM^3JYVj4!ADQ>ni_NE<@oThKykNBQL$E_d?fG5HW5pPl69aY zqwic_s+h8@cLv7GlX?X0ae{NoHxpOVDk*m&Lv!6(-{p^8u^UU@)FWak#7w6gQPTU8 zd8;>{Q~vI0O1)F?S7Es){|n~@w;EV>yTyA1Zq-?~vPr8@M#xXvpn?Edmyf(BLSX~MFF85-N2Rc7ar zG5M{0V(CBu1yyx3<;Rloh}6Bx$!TadNt%t@d6}?Fxfl=Yjoo>L9_=tvm%${Z-NXA% zF{#JD#P_PY^Vp|(Y7|7TgSl&yLqWz|PG_d&H}GKo1~qg+bS?-XwH{{Crmx@u-J1D0 zk~N$Jjdna9j##eSw`3hkhi2k=Ui~S~>29lvFYDZF@cbT@ zZ^5a~E?@RW18Fr>_I{zyh9K6Zi>Bi=1vsUaRYH;r?5S@X)}ZU)p?~%A{SV{+#KjjB zGz37L7^32e&+y%Sk#3FwlK{0!x5fV{Laq?&`HZ|83aSqB=s*}4$q%K_(rU9Qs33HX z3R*99iP+;uh#~0Viog5>Mi!M^3W2Xi7Jj3Oj3wHP4mkdn0l@tNIEi}b&%Q!ycHS$( z)LnsCC)I(@pM;qh)dm0R1sE-4du}0{kqWwWXy3B~QRWD1VEt#9xBUCs3(=a?6>zEz z@9`yt2-(4V;pvB@)~AyWz=I#Ga5*^vI0aqUH85uuR0C;yRj?5J6+p-TlGn8$9DEsC`M#CC13!kOF+8YPTA()E0=KzgNz5@mP|vCe7(&h zpv4B@60sw6Fnsq`qC0!n_r#A9HnTTwDM(w1PTHwHj#9#aUy5fU>^u{pWe<_j6Pl4f&0xa|N?Ss;vUT1LY!9k230USkH) zv4d@Z60h}-0=ya!C>#3YrTqG~;M&c*ce6r}qAdLd}43N|SDX2gZq<`Idgp+5t|O=l3# zG;y5=6zjWGH3j>PIGU5x%p-VcQ{BU6>f$VFq=`iKWJ?WcI(V}R?Pjh71#XmJE;mOs zTYm6f#1_(#qPt*bEHw1ZR1AWV^B8bMxe@uQK~Mg#V7TqFx&`a7{VbTkFh5&C1ABCk zS&+wm^yDEFd#%4Y_9UsA^kI~!5sZCdAAZ9v=sZh2Ur(B^Fj)&3KZcvBL@;e&(7p&( zgGbe%hkjcE1s;dp`=zfg&qRq!!?B7L!Z;XH%de7IM6(;I>mvDx1b}-RlrM-NF6IQx zBkjoH1Q!hFLu1wg-_e9`2{s9+m#I`zUv2_0R(D`nj2{2EaaSAB`lij7Q*H&5Y6XH- zZW2?7?A`Q00SP-7BK^`Y$>q>-`((mYX|xw{7cK?HQem+|c$5q~xh`2_!dii_)#D@{ zVBX-2E2OO<4!1v#?xum(xOfl|aydCpkVPM+4c`O|y}1tv;eW8X-{`@ogoWKWTG1Me zC9)q`bYW}OKo7{+gzkJk>dl>TWl%K&ma5=$y0qTvZ8tt2L=WdpK z14jX|F1K~iESKCEm<#_P~gzTDi>xY9RDs>Hh2Q zhUY`YMt99a#n*YP)>;8#9FSLx9#j;*O$o}9*Yp$>>nCdFyiLhUoAX4S8_TkD6`OlC zi)K(5T`vQjUo^372jAz$47?C{`>2M9sM$ hIVX-Jr_CgVbIQBx-Wl6${Id`_Y;anix6b$YKLO$At8D-P diff --git a/cinelerra-5.1/plugins/theme_pinklady/data/new_bg.png b/cinelerra-5.1/plugins/theme_pinklady/data/new_bg.png index cb78e3780af72b534f99a9e28688e95d1c9459f2..74291ebe2054084e461ad6aa3518a0c18f850ac5 100644 GIT binary patch literal 4055 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 H^!>j9qraam literal 3817 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 bk+jbzBr$1V6@9y+k!%J{ya>!1Gy`Xkab diff --git a/cinelerra-5.1/plugins/theme_suv/data/new_bg.png b/cinelerra-5.1/plugins/theme_suv/data/new_bg.png index f9f6730c9547035a0e7206b8e37dfb5541296fa2..07a5914820c6795d2b861a9bba86cf37c7ec692c 100644 GIT binary patch literal 2652 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 L%cJzuy+{5Hvl;4S literal 3037 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.pid = ts->pmt_start_pid + ts->nb_services; + service->sid = sid; + service->pcr_pid = 0x1fff; ++ service->pcr_sid = 0x1fff; + service->provider_name = av_strdup(provider_name); + service->name = av_strdup(name); + if (!service->provider_name || !service->name) +@@ -722,7 +725,7 @@ + static int64_t get_pcr(const MpegTSWrite *ts, AVIOContext *pb) + { + return av_rescale(avio_tell(pb) + 11, 8 * PCR_TIME_BASE, ts->mux_rate) + +- ts->first_pcr; ++ ts->first_pcr + ts->pcr_offset; + } + + static void mpegts_prefix_m2ts_header(AVFormatContext *s) +@@ -760,6 +763,14 @@ + if (s->max_delay < 0) /* Not set by the caller */ + s->max_delay = 0; + ++ if (ts->m2ts_mode == -1) { ++ if (av_match_ext(s->filename, "m2ts")) { ++ ts->m2ts_mode = 1; ++ } else { ++ ts->m2ts_mode = 0; ++ } ++ } ++ + // round up to a whole number of TS packets + ts->pes_payload_size = (ts->pes_payload_size + 14 + 183) / 184 * 184 - 14; + +@@ -803,6 +814,8 @@ + service->program = program; + } + } ++ if (ts->m2ts_mode > 1) ++ service->pmt.pid = 0x00ff + ts->service_id; + + ts->pat.pid = PAT_PID; + /* Initialize at 15 so that it wraps and is equal to 0 for the +@@ -885,10 +898,9 @@ + ts_st->cc = 15; + /* update PCR pid by using the first video stream */ + if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && +- service->pcr_pid == 0x1fff) { +- service->pcr_pid = ts_st->pid; ++ service->pcr_sid == 0x1fff) + pcr_st = st; +- } ++ + if (st->codecpar->codec_id == AV_CODEC_ID_AAC && + st->codecpar->extradata_size > 0) { + AVStream *ast; +@@ -924,12 +936,24 @@ + av_freep(&pids); + + /* if no video stream, use the first stream as PCR */ +- if (service->pcr_pid == 0x1fff && s->nb_streams > 0) { +- pcr_st = s->streams[0]; +- ts_st = pcr_st->priv_data; +- service->pcr_pid = ts_st->pid; +- } else +- ts_st = pcr_st->priv_data; ++ if (!pcr_st && s->nb_streams > 0) ++ pcr_st = s->streams[0]; ++ if (!pcr_st) { ++ av_log(s, AV_LOG_ERROR, "no streams\n"); ++ ret = AVERROR(EINVAL); ++ goto fail; ++ } ++ ts_st = pcr_st->priv_data; ++ if (service->pcr_sid == 0x1fff) ++ service->pcr_sid = ts_st->pid; ++ if (service->pcr_pid == 0x1fff) ++ service->pcr_pid = ts->m2ts_mode > 1 ? ++ 0x1000 + ts->service_id : service->pcr_sid ; ++ if (service->pmt.pid == service->pcr_pid) { ++ av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", service->pcr_pid); ++ ret = AVERROR(EINVAL); ++ goto fail; ++ } + + if (ts->mux_rate > 1) { + service->pcr_packet_period = (int64_t)ts->mux_rate * ts->pcr_period / +@@ -989,14 +1013,6 @@ + service->pcr_packet_period, + ts->sdt_packet_period, ts->pat_packet_period); + +- if (ts->m2ts_mode == -1) { +- if (av_match_ext(s->filename, "m2ts")) { +- ts->m2ts_mode = 1; +- } else { +- ts->m2ts_mode = 0; +- } +- } +- + return 0; + + fail: +@@ -1010,9 +1026,9 @@ + MpegTSWrite *ts = s->priv_data; + int i; + +- if (++ts->sdt_packet_count == ts->sdt_packet_period || ++ if ( ts->sdt_period >= 0 && (++ts->sdt_packet_count == ts->sdt_packet_period || + (dts != AV_NOPTS_VALUE && ts->last_sdt_ts == AV_NOPTS_VALUE) || +- (dts != AV_NOPTS_VALUE && dts - ts->last_sdt_ts >= ts->sdt_period*90000.0) ++ (dts != AV_NOPTS_VALUE && dts - ts->last_sdt_ts >= ts->sdt_period*90000.0)) + ) { + ts->sdt_packet_count = 0; + if (dts != AV_NOPTS_VALUE) +@@ -1067,13 +1083,14 @@ + { + MpegTSWrite *ts = s->priv_data; + MpegTSWriteStream *ts_st = st->priv_data; ++ uint32_t pcr_pid = ts_st->service->pcr_pid; + uint8_t *q; + uint8_t buf[TS_PACKET_SIZE]; + + q = buf; + *q++ = 0x47; +- *q++ = ts_st->pid >> 8; +- *q++ = ts_st->pid; ++ *q++ = pcr_pid >> 8; ++ *q++ = pcr_pid; + *q++ = 0x20 | ts_st->cc; /* Adaptation only */ + /* Continuity Count field does not increment (see 13818-1 section 2.4.3.3) */ + *q++ = TS_PACKET_SIZE - 5; /* Adaptation Field Length */ +@@ -1148,7 +1165,7 @@ + uint8_t buf[TS_PACKET_SIZE]; + uint8_t *q; + int val, is_start, len, header_len, write_pcr, is_dvb_subtitle, is_dvb_teletext, flags; +- int afc_len, stuffing_len; ++ int afc_len, stuffing_len, write_null; + int64_t pcr = -1; /* avoid warning */ + int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE); + int force_pat = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && key && !ts_st->prev_payload_key; +@@ -1163,8 +1180,8 @@ + retransmit_si_info(s, force_pat, dts); + force_pat = 0; + +- write_pcr = 0; +- if (ts_st->pid == ts_st->service->pcr_pid) { ++ write_pcr = write_null = 0; ++ if (ts_st->pid == ts_st->service->pcr_sid) { + if (ts->mux_rate > 1 || is_start) // VBR pcr period is based on frames + ts_st->service->pcr_packet_count++; + if (ts_st->service->pcr_packet_count >= +@@ -1173,15 +1190,17 @@ + write_pcr = 1; + } + } +- + if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE && +- (dts - get_pcr(ts, s->pb) / 300) > delay) { +- /* pcr insert gets priority over null packet insert */ +- if (write_pcr) +- mpegts_insert_pcr_only(s, st); +- else +- mpegts_insert_null_packet(s); +- /* recalculate write_pcr and possibly retransmit si_info */ ++ (dts - get_pcr(ts, s->pb) / 300) > delay) { ++ write_null = 1; ++ } ++ /* pcr insert gets priority over null packet insert */ ++ if (write_pcr && ts_st->service->pcr_sid != ts_st->service->pcr_pid) { ++ mpegts_insert_pcr_only(s, st); ++ continue; ++ } ++ if (write_null) { ++ mpegts_insert_null_packet(s); + continue; + } + +@@ -1191,13 +1210,17 @@ + val = ts_st->pid >> 8; + if (is_start) + val |= 0x40; ++ if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && ++ st->codecpar->codec_id == AV_CODEC_ID_AC3 && ++ ts->m2ts_mode > 1) ++ val |= 0x20; + *q++ = val; + *q++ = ts_st->pid; + ts_st->cc = ts_st->cc + 1 & 0xf; + *q++ = 0x10 | ts_st->cc; // payload indicator + CC + if (key && is_start && pts != AV_NOPTS_VALUE) { + // set Random Access for key frames +- if (ts_st->pid == ts_st->service->pcr_pid) ++ if (ts_st->pid == ts_st->service->pcr_sid) + write_pcr = 1; + set_af_flag(buf, 0x40); + q = get_ts_payload_start(buf); +@@ -1310,11 +1333,13 @@ + *q++ = flags; + *q++ = header_len; + if (pts != AV_NOPTS_VALUE) { +- write_pts(q, flags >> 6, pts); ++ int64_t ts_pts = pts + ts->pcr_offset; ++ write_pts(q, flags >> 6, ts_pts); + q += 5; + } + if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) { +- write_pts(q, 1, dts); ++ int64_t ts_dts = dts + ts->pcr_offset; ++ write_pts(q, 1, ts_dts); + q += 5; + } + if (pes_extension && st->codecpar->codec_id == AV_CODEC_ID_DIRAC) { +@@ -1838,12 +1863,18 @@ + { "mpegts_pmt_start_pid", "Set the first pid of the PMT.", + offsetof(MpegTSWrite, pmt_start_pid), AV_OPT_TYPE_INT, + { .i64 = 0x1000 }, 0x0010, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM }, ++ { "mpegts_pcr_start_pid", "Set the first pid of the PCR.", ++ offsetof(MpegTSWrite, pcr_start_pid), AV_OPT_TYPE_INT, ++ { .i64 = 0x1000 }, 0x0010, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM }, + { "mpegts_start_pid", "Set the first pid.", + offsetof(MpegTSWrite, start_pid), AV_OPT_TYPE_INT, + { .i64 = 0x0100 }, 0x0020, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM }, + { "mpegts_m2ts_mode", "Enable m2ts mode.", + offsetof(MpegTSWrite, m2ts_mode), AV_OPT_TYPE_BOOL, +- { .i64 = -1 }, -1, 1, AV_OPT_FLAG_ENCODING_PARAM }, ++ { .i64 = -1 }, -1, 2, AV_OPT_FLAG_ENCODING_PARAM }, ++ { "mpegts_pcr_offset", "clock offset.", ++ offsetof(MpegTSWrite, pcr_offset), AV_OPT_TYPE_BOOL, ++ { .i64 = 0 }, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, + { "muxrate", NULL, + offsetof(MpegTSWrite, mux_rate), AV_OPT_TYPE_INT, + { .i64 = 1 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, +@@ -1886,7 +1917,7 @@ + { .dbl = INT_MAX }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, + { "sdt_period", "SDT retransmission time limit in seconds", + offsetof(MpegTSWrite, sdt_period), AV_OPT_TYPE_DOUBLE, +- { .dbl = INT_MAX }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, ++ { .dbl = INT_MAX }, -1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, + { NULL }, + }; + -- 2.26.2