import '../../core/encode_options.dart'; import '../../l10n/tr.dart'; /// 화면 크기 · 코덱 · 화질 · 보정 고르기 (모든 동영상에 적용). /// 약속: 다시 인코딩해야 하는 것 (크기 · 보정) 을 "원본 유지" 에서 고르면 코덱을 H.264 로 저절로 바꾸고 [notice] 에 알릴 글을 둔다. /// 크기 · 보정을 모두 원래대로 돌리면 저절로 바꾼 코덱도 되돌린다 (103). 사용자가 코덱을 직접 고르면 저절로 되돌리지 않는다. class EncodeChoice { EncodeSettings value = const EncodeSettings(); /// 코덱이 저절로 바뀌었을 때 화면에 짧게 알릴 글 (보여 주면 비움) String? notice; /// 103: 크기 · 보정 때문에 "원본 유지" 에서 H.264 로 저절로 바꿨는지 bool _auto = false; EncodeSettings _maybeRestoreCodec(EncodeSettings e) { if (_auto && e.resolution == ResolutionChoice.original && !e.adjusts && e.codec == VideoCodecChoice.h264) { _auto = false; notice = tr('크기 · 보정을 원래대로 돌려 코덱도 "원본 유지" 로 되돌렸습니다.'); return e.copyWith(codec: VideoCodecChoice.copy); } return e; } void setCodec(VideoCodecChoice c) { _auto = false; // 사용자가 직접 고름 // 원본 유지(복사)는 크기 · 화면 비율 · 회전 · 색 보정을 할 수 없으므로 처음으로 value = c == VideoCodecChoice.copy ? value.resetAdjust().copyWith(codec: c, resolution: ResolutionChoice.original) : value.copyWith(codec: c); } /// 화면 비율 · 회전 · 색 보정 바꾸기 (재인코딩이 필요하면 기본 H.264 로) void setAdjust(EncodeSettings e) { if (e.adjusts && e.codec == VideoCodecChoice.copy) { _auto = true; notice = tr('보정은 다시 인코딩해야 해서 코덱을 "원본 유지" 에서 H.264 로 바꿨습니다.'); value = e.copyWith(codec: VideoCodecChoice.h264); } else { value = _maybeRestoreCodec(e); } } void setResolution(ResolutionChoice r) { // 크기를 바꾸려면 재인코딩이 필요하므로 기본 H.264 로 final needCodec = r != ResolutionChoice.original && value.codec == VideoCodecChoice.copy; if (needCodec) { _auto = true; notice = tr('크기를 바꾸면 다시 인코딩해야 해서 코덱을 "원본 유지" 에서 H.264 로 바꿨습니다.'); } value = _maybeRestoreCodec(value.copyWith(resolution: r, codec: needCodec ? VideoCodecChoice.h264 : null)); } void setQuality(QualityChoice q) => value = value.copyWith(quality: q); }