Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions demux/demux_lavf.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include <libavutil/opt.h>
#include <libavutil/pixdesc.h>
#include <libavutil/replaygain.h>
#include <libavutil/stereo3d.h>

#include "audio/chmap_avchannel.h"

Expand All @@ -58,6 +59,7 @@
#include "options/m_option.h"
#include "options/options.h"
#include "options/path.h"
#include "video/csputils.h"

#define INITIAL_PROBE_SIZE STREAM_BUFFER_SIZE
#define PROBE_BUF_SIZE (10 * 1024 * 1024)
Expand Down Expand Up @@ -783,6 +785,9 @@ static void handle_new_stream(demuxer_t *demuxer, int i)
sh->codec->rotate = (((int)(-r) % 360) + 360) % 360;
}

if ((sd = mp_av_stream_get_side_data(st, AV_PKT_DATA_STEREO3D)))
sh->codec->stereo_mode = mp_stereo3d_from_av((const AVStereo3D *)sd);

if ((sd = mp_av_stream_get_side_data(st, AV_PKT_DATA_DOVI_CONF))) {
const AVDOVIDecoderConfigurationRecord *cfg = (void *) sd;
MP_VERBOSE(demuxer, "Found Dolby Vision config record: profile "
Expand Down
24 changes: 24 additions & 0 deletions video/csputils.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <math.h>
#include <assert.h>
#include <libavutil/common.h>
#include <libavutil/stereo3d.h>
#include <libavcodec/avcodec.h>

#include "mp_image.h"
Expand Down Expand Up @@ -154,6 +155,29 @@ const struct m_opt_choice_alternatives mp_stereo3d_names[] = {
{0}
};

enum mp_stereo3d_mode mp_stereo3d_from_av(const struct AVStereo3D *s3d)
{
bool inv = s3d->flags & AV_STEREO3D_FLAG_INVERT;
switch (s3d->type) {
case AV_STEREO3D_SIDEBYSIDE:
case AV_STEREO3D_SIDEBYSIDE_QUINCUNX:
return inv ? MP_STEREO3D_SBS2R : MP_STEREO3D_SBS2L;
case AV_STEREO3D_TOPBOTTOM:
return inv ? MP_STEREO3D_AB2R : MP_STEREO3D_AB2L;
case AV_STEREO3D_CHECKERBOARD:
return inv ? MP_STEREO3D_CHECKR : MP_STEREO3D_CHECKL;
case AV_STEREO3D_LINES:
return inv ? MP_STEREO3D_IRR : MP_STEREO3D_IRL;
case AV_STEREO3D_COLUMNS:
return inv ? MP_STEREO3D_ICR : MP_STEREO3D_ICL;
case AV_STEREO3D_FRAMESEQUENCE:
return inv ? MP_STEREO3D_AR : MP_STEREO3D_AL;
default:
// AV_STEREO3D_2D and types mpv has no mode for.
return MP_STEREO3D_MONO;
}
}

void mp_get_3d_side_by_side(int stereo_mode, int div[2])
{
div[0] = div[1] = 1;
Expand Down
3 changes: 3 additions & 0 deletions video/csputils.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ enum mp_stereo3d_mode {

extern const struct m_opt_choice_alternatives mp_stereo3d_names[];

struct AVStereo3D;
enum mp_stereo3d_mode mp_stereo3d_from_av(const struct AVStereo3D *s3d);

#define MP_STEREO3D_NAME_DEF(x, def) m_opt_choice_str_def(mp_stereo3d_names, x, def)

// Number of screen divisions per axis (div[0]=x, div[1]=y) for the given 3D mode
Expand Down
25 changes: 1 addition & 24 deletions video/mp_image.c
Original file line number Diff line number Diff line change
Expand Up @@ -1080,29 +1080,6 @@ void mp_image_params_guess_csp(struct mp_image_params *params)
}
}

static enum mp_stereo3d_mode stereo3d_from_av(const AVStereo3D *s3d)
{
bool inv = s3d->flags & AV_STEREO3D_FLAG_INVERT;
switch (s3d->type) {
case AV_STEREO3D_SIDEBYSIDE:
case AV_STEREO3D_SIDEBYSIDE_QUINCUNX:
return inv ? MP_STEREO3D_SBS2R : MP_STEREO3D_SBS2L;
case AV_STEREO3D_TOPBOTTOM:
return inv ? MP_STEREO3D_AB2R : MP_STEREO3D_AB2L;
case AV_STEREO3D_CHECKERBOARD:
return inv ? MP_STEREO3D_CHECKR : MP_STEREO3D_CHECKL;
case AV_STEREO3D_LINES:
return inv ? MP_STEREO3D_IRR : MP_STEREO3D_IRL;
case AV_STEREO3D_COLUMNS:
return inv ? MP_STEREO3D_ICR : MP_STEREO3D_ICL;
case AV_STEREO3D_FRAMESEQUENCE:
return inv ? MP_STEREO3D_AR : MP_STEREO3D_AL;
default:
// AV_STEREO3D_2D and types mpv has no mode for.
return MP_STEREO3D_MONO;
}
}

// Create a new mp_image reference to av_frame.
struct mp_image *mp_image_from_av_frame(struct AVFrame *src)
{
Expand Down Expand Up @@ -1157,7 +1134,7 @@ struct mp_image *mp_image_from_av_frame(struct AVFrame *src)

sd = av_frame_get_side_data(src, AV_FRAME_DATA_STEREO3D);
if (sd)
dst->params.stereo3d = stereo3d_from_av((const AVStereo3D *)sd->data);
dst->params.stereo3d = mp_stereo3d_from_av((const AVStereo3D *)sd->data);

if (src->opaque_ref) {
struct mp_image_params *p = (void *)src->opaque_ref->data;
Expand Down
Loading