From e3c81d537528ce9e4300d54fc5c89e20c21070a0 Mon Sep 17 00:00:00 2001 From: Good Guy Date: Sat, 5 Sep 2015 11:33:02 -0600 Subject: [PATCH] move aspect ratio fixex, better get_info, fixes for ffmpeg asset detection --- cinelerra-5.0/cinelerra/assetedit.C | 4 +- cinelerra-5.0/cinelerra/bdwrite.C | 14 ++--- cinelerra-5.0/cinelerra/ffmpeg.C | 9 +++- cinelerra-5.0/cinelerra/fileffmpeg.C | 5 +- cinelerra-5.0/cinelerra/fileffmpeg.h | 2 +- cinelerra-5.0/cinelerra/filempeg.C | 80 ++++++++++++++-------------- cinelerra-5.0/cinelerra/filempeg.h | 2 +- 7 files changed, 62 insertions(+), 54 deletions(-) diff --git a/cinelerra-5.0/cinelerra/assetedit.C b/cinelerra-5.0/cinelerra/assetedit.C index e52f39c7..c7ef9f24 100644 --- a/cinelerra-5.0/cinelerra/assetedit.C +++ b/cinelerra-5.0/cinelerra/assetedit.C @@ -814,10 +814,10 @@ void DetailAssetWindow::create_objects() if( !mwindow->preferences->get_asset_file_path(asset, file_name) ) { switch( asset->format ) { case FILE_MPEG: - FileMPEG::get_info(asset->path, file_name, &info[0]); + FileMPEG::get_info(asset->path, file_name, &info[0],len); break; case FILE_FFMPEG: - FileFFMPEG::get_info(asset->path, &info[0]); + FileFFMPEG::get_info(asset->path, &info[0],len); break; } } diff --git a/cinelerra-5.0/cinelerra/bdwrite.C b/cinelerra-5.0/cinelerra/bdwrite.C index 2eb20f71..93b65690 100644 --- a/cinelerra-5.0/cinelerra/bdwrite.C +++ b/cinelerra-5.0/cinelerra/bdwrite.C @@ -2448,12 +2448,13 @@ static int bd_video_rate(double rate) exit(1); } -static int bd_aspect_ratio(int w, double ratio) +static int bd_aspect_ratio(int w, int h, double ratio) { - if( fabs(ratio-1.333) < 0.01 ) return BLURAY_ASPECT_RATIO_4_3; - if( fabs(ratio-1.777) < 0.01 ) return BLURAY_ASPECT_RATIO_16_9; + double aspect = (w * ratio) / h; + if( fabs(aspect-1.333) < 0.01 ) return BLURAY_ASPECT_RATIO_4_3; + if( fabs(aspect-1.777) < 0.01 ) return BLURAY_ASPECT_RATIO_16_9; return w == 720 ? BLURAY_ASPECT_RATIO_4_3 : BLURAY_ASPECT_RATIO_16_9; - fprintf(stderr, "unknown bluray aspect ratio %5.3f\n",ratio); + fprintf(stderr, "unknown bluray aspect ratio %5.3f\n",aspect); exit(1); } @@ -2495,8 +2496,9 @@ int media_info::scan() st->codec->flags & CODEC_FLAG_INTERLACED_ME); s->rate = bd_video_rate(!st->codec->framerate.den ? 0 : (double)st->codec->framerate.num / st->codec->framerate.den); - s->aspect = bd_aspect_ratio(st->codec->width,!st->sample_aspect_ratio.den ? 0 : - (double)st->sample_aspect_ratio.num / st->sample_aspect_ratio.den); + s->aspect = bd_aspect_ratio(st->codec->width, st->codec->height, + !st->sample_aspect_ratio.num || !st->sample_aspect_ratio.den ? 1. : + (double)st->sample_aspect_ratio.num / st->sample_aspect_ratio.den); break; } case AVMEDIA_TYPE_AUDIO: { s->coding_type = bd_stream_type(codec_id); diff --git a/cinelerra-5.0/cinelerra/ffmpeg.C b/cinelerra-5.0/cinelerra/ffmpeg.C index de983a3a..2f1a1987 100644 --- a/cinelerra-5.0/cinelerra/ffmpeg.C +++ b/cinelerra-5.0/cinelerra/ffmpeg.C @@ -1339,7 +1339,13 @@ int FFMPEG::open_decoder() AVStream *st = fmt_ctx->streams[i]; if( st->duration == AV_NOPTS_VALUE ) bad_time = 1; AVCodecContext *avctx = st->codec; + const AVCodecDescriptor *codec_desc = avcodec_descriptor_get(avctx->codec_id); + if( !codec_desc ) continue; if( avctx->codec_type == AVMEDIA_TYPE_VIDEO ) { + if( avctx->width < 1 ) continue; + if( avctx->height < 1 ) continue; + AVRational framerate = av_guess_frame_rate(fmt_ctx, st, 0); + if( framerate.num < 1 ) continue; has_video = 1; FFVideoStream *vid = new FFVideoStream(this, st, i); int vidx = ffvideo.size(); @@ -1347,7 +1353,6 @@ int FFMPEG::open_decoder() ffvideo.append(vid); vid->width = avctx->width; vid->height = avctx->height; - AVRational framerate = av_guess_frame_rate(fmt_ctx, st, 0); vid->frame_rate = !framerate.den ? 0 : (double)framerate.num / framerate.den; double secs = to_secs(st->duration, st->time_base); vid->length = secs * vid->frame_rate; @@ -1358,6 +1363,8 @@ int FFMPEG::open_decoder() vid->create_filter(opt_video_filter, avctx,avctx); } else if( avctx->codec_type == AVMEDIA_TYPE_AUDIO ) { + if( avctx->channels < 1 ) continue; + if( avctx->sample_rate < 1 ) continue; has_audio = 1; FFAudioStream *aud = new FFAudioStream(this, st, i); int aidx = ffaudio.size(); diff --git a/cinelerra-5.0/cinelerra/fileffmpeg.C b/cinelerra-5.0/cinelerra/fileffmpeg.C index 6a8681d4..90c1a6ef 100644 --- a/cinelerra-5.0/cinelerra/fileffmpeg.C +++ b/cinelerra-5.0/cinelerra/fileffmpeg.C @@ -132,7 +132,7 @@ int FileFFMPEG::check_sig(Asset *asset) return ret; } -void FileFFMPEG::get_info(char *path, char *text) +void FileFFMPEG::get_info(char *path, char *text, int len) { char *cp = text; FFMPEG ffmpeg(0); @@ -150,7 +150,7 @@ void FileFFMPEG::get_info(char *path, char *text) if( !ret ) ret = ffmpeg.open_decoder(); if( !ret ) { cp += sprintf(cp, _("info:\n")); - ffmpeg.info(cp, BCTEXTLEN-(cp-text)); + ffmpeg.info(cp, len-(cp-text)); } else sprintf(cp, _("== open failed\n")); @@ -187,7 +187,6 @@ int FileFFMPEG::select_video_stream(Asset *asset, int vstream) int FileFFMPEG::select_audio_stream(Asset *asset, int astream) { if( !ff || !asset->audio_data ) return 1; - asset->channels = ff->ff_audio_channels(astream); asset->sample_rate = ff->ff_sample_rate(astream); asset->audio_length = ff->ff_audio_samples(astream); return 0; diff --git a/cinelerra-5.0/cinelerra/fileffmpeg.h b/cinelerra-5.0/cinelerra/fileffmpeg.h index 8e42862a..bde3d5d5 100644 --- a/cinelerra-5.0/cinelerra/fileffmpeg.h +++ b/cinelerra-5.0/cinelerra/fileffmpeg.h @@ -47,7 +47,7 @@ public: int get_video_info(int track, int &pid, double &framerate, int &width, int &height, char *title=0); int get_audio_for_video(int vstream, int astream, int64_t &channel_mask); - static void get_info(char *path,char *text); + static void get_info(char *path,char *text,int len); int open_file(int rd,int wr); int close_file(void); int set_video_position(int64_t pos); diff --git a/cinelerra-5.0/cinelerra/filempeg.C b/cinelerra-5.0/cinelerra/filempeg.C index 584dc189..dfd27181 100644 --- a/cinelerra-5.0/cinelerra/filempeg.C +++ b/cinelerra-5.0/cinelerra/filempeg.C @@ -134,7 +134,7 @@ int FileMPEG::check_sig(Asset *asset) return mpeg3_check_sig(asset->path); } -void FileMPEG::get_info(char *title_path, char *path, char *text) +void FileMPEG::get_info(char *title_path, char *path, char *text, int len) { mpeg3_t *fd; *text = 0; @@ -145,32 +145,32 @@ void FileMPEG::get_info(char *title_path, char *path, char *text) if( !result ) result = mpeg3_create_title(fd, 0); if( result ) return; - char *cp = text; + char *cp = text, *ep = text + len-1; if( mpeg3_has_toc(fd) ) { - cp += sprintf(cp, _("toc path:%s\n"), path); - cp += sprintf(cp, _("title path:\n")); + cp += snprintf(cp,ep-cp, _("toc path:%s\n"), path); + cp += snprintf(cp,ep-cp, _("title path:\n")); for( int i=0; i<100; ++i ) { char *title_path = mpeg3_title_path(fd,i); if( !title_path ) break; - cp += sprintf(cp, " %2d. %s\n", i+1, title_path); + cp += snprintf(cp,ep-cp, " %2d. %s\n", i+1, title_path); } } else - cp += sprintf(cp, _("file path:%s\n"), path); + cp += snprintf(cp,ep-cp, _("file path:%s\n"), path); int64_t bytes = mpeg3_get_bytes(fd); char string[BCTEXTLEN]; sprintf(string,"%ld",bytes); Units::punctuate(string); - cp += sprintf(cp, _("size: %s"), string); + cp += snprintf(cp,ep-cp, _("size: %s"), string); if( mpeg3_is_program_stream(fd) ) - cp += sprintf(cp, _(" program stream\n")); + cp += snprintf(cp,ep-cp, _(" program stream\n")); else if( mpeg3_is_transport_stream(fd) ) - cp += sprintf(cp, _(" transport stream\n")); + cp += snprintf(cp,ep-cp, _(" transport stream\n")); else if( mpeg3_is_video_stream(fd) ) - cp += sprintf(cp, _(" video stream\n")); + cp += snprintf(cp,ep-cp, _(" video stream\n")); else if( mpeg3_is_audio_stream(fd) ) - cp += sprintf(cp, _(" audio stream\n")); + cp += snprintf(cp,ep-cp, _(" audio stream\n")); int64_t sdate = mpeg3_get_source_date(fd); if( !sdate ) { @@ -179,60 +179,60 @@ void FileMPEG::get_info(char *title_path, char *path, char *text) sdate = stat64(path, &ostat) < 0 ? 0 : ostat.st_mtime; } time_t tm = (time_t)sdate; - cp += sprintf(cp, _("date: %s\n"), ctime(&tm)); + cp += snprintf(cp,ep-cp, _("date: %s\n"), ctime(&tm)); int vtrks = mpeg3_total_vstreams(fd); - cp += sprintf(cp, _("%d video tracks\n"), vtrks); + cp += snprintf(cp,ep-cp, _("%d video tracks\n"), vtrks); for( int vtrk=0; vtrk 0 ) { double secs = (double)frames / frame_rate; - cp += sprintf(cp, _(" (%0.3f secs)"),secs); + cp += snprintf(cp,ep-cp, _(" (%0.3f secs)"),secs); } *cp++ = '\n'; } int atrks = mpeg3_total_astreams(fd); - cp += sprintf(cp, _("%d audio tracks\n"), atrks); + cp += snprintf(cp,ep-cp, _("%d audio tracks\n"), atrks); for( int atrk=0; atrk= 0 ? '+' : (nudge=-nudge, '-'); - cp += sprintf(cp, _("%ld samples"),nudge); + cp += snprintf(cp,ep-cp, _("%ld samples"),nudge); if( sample_rate > 0 ) { double secs = (double)(samples+nudge) / sample_rate; - cp += sprintf(cp, _(" (%0.3f secs)"),secs); + cp += snprintf(cp,ep-cp, _(" (%0.3f secs)"),secs); } *cp++ = '\n'; } int stracks = mpeg3_subtitle_tracks(fd); if( stracks > 0 ) { - cp += sprintf(cp, _("%d subtitles\n"), stracks); + cp += snprintf(cp,ep-cp, _("%d subtitles\n"), stracks); } int vts_titles = mpeg3_get_total_vts_titles(fd); if( vts_titles > 0 ) - cp += sprintf(cp, _("%d title sets, "), vts_titles); + cp += snprintf(cp,ep-cp, _("%d title sets, "), vts_titles); int interleaves = mpeg3_get_total_interleaves(fd); if( interleaves > 0 ) - cp += sprintf(cp, _("%d interleaves\n"), interleaves); + cp += snprintf(cp,ep-cp, _("%d interleaves\n"), interleaves); int vts_title = mpeg3_set_vts_title(fd, -1); int angle = mpeg3_set_angle(fd, -1); int interleave = mpeg3_set_interleave(fd, -1); int program = mpeg3_set_program(fd, -1); - cp += sprintf(cp, _("current program %d = title %d, angle %d, interleave %d\n\n"), + cp += snprintf(cp,ep-cp, _("current program %d = title %d, angle %d, interleave %d\n\n"), program, vts_title, angle, interleave); ArrayList cell_times; @@ -241,21 +241,21 @@ void FileMPEG::get_info(char *title_path, char *path, char *text) cell_times.append(cell_time); } if( cell_times.size() > 1 ) { - cp += sprintf(cp, _("cell times:")); + cp += snprintf(cp,ep-cp, _("cell times:")); for( int i=0; i= 0; ++i ) { @@ -306,6 +306,7 @@ void FileMPEG::get_info(char *title_path, char *path, char *text) } } + *cp = 0; mpeg3_close(fd); return; } @@ -1189,7 +1190,6 @@ int FileMPEG::select_video_stream(Asset *asset, int vstream) int FileMPEG::select_audio_stream(Asset *asset, int astream) { if( !fd ) return -1; - asset->channels = mpeg3_audio_channels(fd, astream); asset->sample_rate = mpeg3_sample_rate(fd, astream); asset->audio_length = mpeg3_audio_samples(fd, astream); return 0; diff --git a/cinelerra-5.0/cinelerra/filempeg.h b/cinelerra-5.0/cinelerra/filempeg.h index 004316b6..cde4458c 100644 --- a/cinelerra-5.0/cinelerra/filempeg.h +++ b/cinelerra-5.0/cinelerra/filempeg.h @@ -69,7 +69,7 @@ public: static int check_sig(Asset *asset); // Get extra info for info dialog. - static void get_info(char *title_path, char *path, char *text); + static void get_info(char *title_path, char *path, char *text, int len); int open_file(int rd, int wr); int close_file(); int create_index(); -- 2.26.2