mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-17 12:27:18 +00:00
avformat/movenc: support writing cropping values
Finishes implementing ticket #7437. Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
93be6b425e
commit
32588a9394
@ -2351,18 +2351,31 @@ static int mov_write_dvcc_dvvc_tag(AVFormatContext *s, AVIOContext *pb, AVDOVIDe
|
|||||||
return 32; /* 8 + 24 */
|
return 32; /* 8 + 24 */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mov_write_clap_tag(AVIOContext *pb, MOVTrack *track)
|
static int mov_write_clap_tag(AVIOContext *pb, MOVTrack *track,
|
||||||
|
uint32_t top, uint32_t bottom,
|
||||||
|
uint32_t left, uint32_t right)
|
||||||
{
|
{
|
||||||
|
uint32_t cropped_width = track->par->width - left - right;
|
||||||
|
uint32_t cropped_height = track->height - top - bottom;
|
||||||
|
AVRational horizOff =
|
||||||
|
av_sub_q((AVRational) { track->par->width - cropped_width, 2 },
|
||||||
|
(AVRational) { left, 1 });
|
||||||
|
AVRational vertOff =
|
||||||
|
av_sub_q((AVRational) { track->height - cropped_height, 2 },
|
||||||
|
(AVRational) { top, 1 });
|
||||||
|
|
||||||
avio_wb32(pb, 40);
|
avio_wb32(pb, 40);
|
||||||
ffio_wfourcc(pb, "clap");
|
ffio_wfourcc(pb, "clap");
|
||||||
avio_wb32(pb, track->par->width); /* apertureWidth_N */
|
avio_wb32(pb, cropped_width); /* apertureWidthN */
|
||||||
avio_wb32(pb, 1); /* apertureWidth_D (= 1) */
|
avio_wb32(pb, 1); /* apertureWidthD */
|
||||||
avio_wb32(pb, track->height); /* apertureHeight_N */
|
avio_wb32(pb, cropped_height); /* apertureHeightN */
|
||||||
avio_wb32(pb, 1); /* apertureHeight_D (= 1) */
|
avio_wb32(pb, 1); /* apertureHeightD */
|
||||||
avio_wb32(pb, 0); /* horizOff_N (= 0) */
|
|
||||||
avio_wb32(pb, 1); /* horizOff_D (= 1) */
|
avio_wb32(pb, -horizOff.num);
|
||||||
avio_wb32(pb, 0); /* vertOff_N (= 0) */
|
avio_wb32(pb, horizOff.den);
|
||||||
avio_wb32(pb, 1); /* vertOff_D (= 1) */
|
avio_wb32(pb, -vertOff.num);
|
||||||
|
avio_wb32(pb, vertOff.den);
|
||||||
|
|
||||||
return 40;
|
return 40;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2590,6 +2603,7 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex
|
|||||||
{
|
{
|
||||||
int ret = AVERROR_BUG;
|
int ret = AVERROR_BUG;
|
||||||
int64_t pos = avio_tell(pb);
|
int64_t pos = avio_tell(pb);
|
||||||
|
const AVPacketSideData *sd;
|
||||||
char compressor_name[32] = { 0 };
|
char compressor_name[32] = { 0 };
|
||||||
int avid = 0;
|
int avid = 0;
|
||||||
|
|
||||||
@ -2763,7 +2777,6 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex
|
|||||||
|
|
||||||
if (track->mode == MODE_MOV || (track->mode == MODE_MP4 &&
|
if (track->mode == MODE_MOV || (track->mode == MODE_MP4 &&
|
||||||
mov->fc->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL)) {
|
mov->fc->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL)) {
|
||||||
const AVPacketSideData *sd;
|
|
||||||
const AVStereo3D *stereo3d = NULL;
|
const AVStereo3D *stereo3d = NULL;
|
||||||
const AVSphericalMapping *spherical_mapping = NULL;
|
const AVSphericalMapping *spherical_mapping = NULL;
|
||||||
|
|
||||||
@ -2800,9 +2813,24 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex
|
|||||||
mov_write_pasp_tag(pb, track);
|
mov_write_pasp_tag(pb, track);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uncompressed_ycbcr){
|
sd = av_packet_side_data_get(track->st->codecpar->coded_side_data,
|
||||||
mov_write_clap_tag(pb, track);
|
track->st->codecpar->nb_coded_side_data,
|
||||||
}
|
AV_PKT_DATA_FRAME_CROPPING);
|
||||||
|
if (sd && sd->size >= sizeof(uint32_t) * 4) {
|
||||||
|
uint64_t top = AV_RL32(sd->data + 0);
|
||||||
|
uint64_t bottom = AV_RL32(sd->data + 4);
|
||||||
|
uint64_t left = AV_RL32(sd->data + 8);
|
||||||
|
uint64_t right = AV_RL32(sd->data + 12);
|
||||||
|
|
||||||
|
if ((left + right) >= track->par->width ||
|
||||||
|
(top + bottom) >= track->height) {
|
||||||
|
av_log(s, AV_LOG_ERROR, "Invalid cropping dimensions in stream side data\n");
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
if (top || bottom || left || right)
|
||||||
|
mov_write_clap_tag(pb, track, top, bottom, left, right);
|
||||||
|
} else if (uncompressed_ycbcr)
|
||||||
|
mov_write_clap_tag(pb, track, 0, 0, 0, 0);
|
||||||
|
|
||||||
if (mov->encryption_scheme != MOV_ENC_NONE) {
|
if (mov->encryption_scheme != MOV_ENC_NONE) {
|
||||||
ff_mov_cenc_write_sinf_tag(track, pb, mov->encryption_kid);
|
ff_mov_cenc_write_sinf_tag(track, pb, mov->encryption_kid);
|
||||||
|
@ -1,24 +1,24 @@
|
|||||||
34b0ad38518b0eb8464aff04e6d0e143 *tests/data/fate/copy-trac236.mov
|
ca4068319c6586de757c1f6a592b31e5 *tests/data/fate/copy-trac236.mov
|
||||||
630878 tests/data/fate/copy-trac236.mov
|
630918 tests/data/fate/copy-trac236.mov
|
||||||
#tb 0: 100/2997
|
#tb 0: 100/2997
|
||||||
#media_type 0: video
|
#media_type 0: video
|
||||||
#codec_id 0: rawvideo
|
#codec_id 0: rawvideo
|
||||||
#dimensions 0: 720x480
|
#dimensions 0: 704x480
|
||||||
#sar 0: 10/11
|
#sar 0: 10/11
|
||||||
#tb 1: 1/48000
|
#tb 1: 1/48000
|
||||||
#media_type 1: audio
|
#media_type 1: audio
|
||||||
#codec_id 1: pcm_s16le
|
#codec_id 1: pcm_s16le
|
||||||
#sample_rate 1: 48000
|
#sample_rate 1: 48000
|
||||||
#channel_layout_name 1: stereo
|
#channel_layout_name 1: stereo
|
||||||
0, 0, 0, 1, 518400, 0x81ab2140
|
0, 0, 0, 1, 506880, 0xc4d654e3
|
||||||
1, 0, 0, 1024, 4096, 0x67dc99a3
|
1, 0, 0, 1024, 4096, 0x67dc99a3
|
||||||
1, 1024, 1024, 1024, 4096, 0xf115a681
|
1, 1024, 1024, 1024, 4096, 0xf115a681
|
||||||
0, 1, 1, 1, 518400, 0x81ab2140
|
0, 1, 1, 1, 506880, 0xc4d654e3
|
||||||
1, 2048, 2048, 1024, 4096, 0xf455b597
|
1, 2048, 2048, 1024, 4096, 0xf455b597
|
||||||
1, 3072, 3072, 1024, 4096, 0x67dc99a3
|
1, 3072, 3072, 1024, 4096, 0x67dc99a3
|
||||||
0, 2, 2, 1, 518400, 0x81ab2140
|
0, 2, 2, 1, 506880, 0xc4d654e3
|
||||||
1, 4096, 4096, 1024, 4096, 0xf115a681
|
1, 4096, 4096, 1024, 4096, 0xf115a681
|
||||||
0, 3, 3, 1, 518400, 0x81ab2140
|
0, 3, 3, 1, 506880, 0xc4d654e3
|
||||||
1, 5120, 5120, 1024, 4096, 0xf455b597
|
1, 5120, 5120, 1024, 4096, 0xf455b597
|
||||||
1, 6144, 6144, 759, 3036, 0xa291a36d
|
1, 6144, 6144, 759, 3036, 0xa291a36d
|
||||||
0, 4, 4, 1, 518400, 0x81ab2140
|
0, 4, 4, 1, 506880, 0xc4d654e3
|
||||||
|
Loading…
Reference in New Issue
Block a user