summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/media/ffmpeg.go85
-rw-r--r--internal/media/processingmedia.go1
-rw-r--r--internal/media/util.go29
3 files changed, 65 insertions, 50 deletions
diff --git a/internal/media/ffmpeg.go b/internal/media/ffmpeg.go
index 0de5797ab..e26ec78d7 100644
--- a/internal/media/ffmpeg.go
+++ b/internal/media/ffmpeg.go
@@ -437,6 +437,42 @@ func (res *ffprobeResult) Process() (*result, error) {
}
}
+ // Check extra packet / frame information
+ // for provided orientation (not always set).
+ for _, pf := range res.PacketsAndFrames {
+ for _, d := range pf.SideDataList {
+
+ // Ensure frame side
+ // data IS rotation data.
+ if d.Rotation == 0 {
+ continue
+ }
+
+ // Ensure rotation not
+ // already been specified.
+ if r.rotation != 0 {
+ return nil, errors.New("multiple sets of rotation data")
+ }
+
+ // Drop any decimal
+ // rotation value.
+ rot := int(d.Rotation)
+
+ // Round rotation to multiple of 90.
+ // More granularity is not needed.
+ if q := rot % 90; q > 45 {
+ rot += (90 - q)
+ } else {
+ rot -= q
+ }
+
+ // Drop any value above 360
+ // or below -360, these are
+ // just repeat full turns.
+ r.rotation = (rot % 360)
+ }
+ }
+
// Preallocate streams to max possible lengths.
r.audio = make([]audioStream, 0, len(res.Streams))
r.video = make([]videoStream, 0, len(res.Streams))
@@ -450,12 +486,19 @@ func (res *ffprobeResult) Process() (*result, error) {
stream: stream{codec: s.CodecName},
})
case "video":
- var framerate float32
+ // Determine proper display dimensions,
+ // taking account of rotation data.
+ width, height := displayDimensions(
+ s.Width,
+ s.Height,
+ r.rotation,
+ )
// Parse stream framerate, bearing in
// mind that some static container formats
// (e.g. jpeg) still return a framerate, so
// we also check for a non-1 timebase (dts).
+ var framerate float32
if str := s.RFrameRate; str != "" &&
s.DurationTS > 1 {
var num, den uint32
@@ -478,49 +521,13 @@ func (res *ffprobeResult) Process() (*result, error) {
// Append video stream data to result.
r.video = append(r.video, videoStream{
stream: stream{codec: s.CodecName},
- width: s.Width,
- height: s.Height,
+ width: width,
+ height: height,
framerate: framerate,
})
}
}
- // Check extra packet / frame information
- // for provided orientation (not always set).
- for _, pf := range res.PacketsAndFrames {
- for _, d := range pf.SideDataList {
-
- // Ensure frame side
- // data IS rotation data.
- if d.Rotation == 0 {
- continue
- }
-
- // Ensure rotation not
- // already been specified.
- if r.rotation != 0 {
- return nil, errors.New("multiple sets of rotation data")
- }
-
- // Drop any decimal
- // rotation value.
- rot := int(d.Rotation)
-
- // Round rotation to multiple of 90.
- // More granularity is not needed.
- if q := rot % 90; q > 45 {
- rot += (90 - q)
- } else {
- rot -= q
- }
-
- // Drop any value above 360
- // or below -360, these are
- // just repeat full turns.
- r.rotation = (rot % 360)
- }
- }
-
return &r, nil
}
diff --git a/internal/media/processingmedia.go b/internal/media/processingmedia.go
index 3da036ac7..5d1d47b97 100644
--- a/internal/media/processingmedia.go
+++ b/internal/media/processingmedia.go
@@ -223,7 +223,6 @@ func (p *ProcessingMedia) store(ctx context.Context) error {
width,
height,
aspect,
- result.rotation,
)
p.media.FileMeta.Small.Width = thumbWidth
p.media.FileMeta.Small.Height = thumbHeight
diff --git a/internal/media/util.go b/internal/media/util.go
index dd445844d..7e84b4cdc 100644
--- a/internal/media/util.go
+++ b/internal/media/util.go
@@ -35,15 +35,13 @@ import (
"github.com/disintegration/imaging"
)
-// thumbSize returns the dimensions to use for an input
-// image of given width / height, for its outgoing thumbnail.
-// This attempts to maintains the original image aspect ratio.
-func thumbSize(width, height int, aspect float32, rotation int) (int, int) {
- const (
- maxThumbWidth = 512
- maxThumbHeight = 512
- )
-
+// displayDimensions takes account of the
+// given rotation data to return width and
+// height values as the image will be displayed.
+func displayDimensions(
+ width, height int,
+ rotation int,
+) (int, int) {
// If image is rotated by
// any odd multiples of 90,
// flip width / height to
@@ -51,9 +49,20 @@ func thumbSize(width, height int, aspect float32, rotation int) (int, int) {
switch rotation {
case -90, 90, -270, 270:
width, height = height, width
- aspect = 1 / aspect
}
+ return width, height
+}
+
+// thumbSize returns the dimensions to use for an input
+// image of given width / height, for its outgoing thumbnail.
+// This attempts to maintains the original image aspect ratio.
+func thumbSize(width, height int, aspect float32) (int, int) {
+ const (
+ maxThumbWidth = 512
+ maxThumbHeight = 512
+ )
+
switch {
// Simplest case, within bounds!
case width < maxThumbWidth &&