1/* MiniDLNA media server
2 * Copyright (C) 2013  NETGEAR
3 *
4 * This file is part of MiniDLNA.
5 *
6 * MiniDLNA is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * MiniDLNA is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with MiniDLNA. If not, see <http://www.gnu.org/licenses/>.
17 */
18/* Foxconn modify start, Bernie 06/01/2016 */
19#include "../ffmpeg-2.3.4/libavutil/avutil.h"
20#include "../ffmpeg-2.3.4/libavcodec/avcodec.h"
21#include "../ffmpeg-2.3.4/libavformat/avformat.h"
22/* Foxconn modify end, Bernie 06/01/2016 */
23
24#ifndef FF_PROFILE_H264_BASELINE
25#define FF_PROFILE_H264_BASELINE 66
26#endif
27#ifndef FF_PROFILE_H264_CONSTRAINED_BASELINE
28#define FF_PROFILE_H264_CONSTRAINED_BASELINE 578
29#endif
30#ifndef FF_PROFILE_H264_MAIN
31#define FF_PROFILE_H264_MAIN 77
32#endif
33#ifndef FF_PROFILE_H264_HIGH
34#define FF_PROFILE_H264_HIGH 100
35#endif
36/* Foxconn modify start, Bernie 06/01/2016 */
37//#ifndef FF_PROFILE_SKIP
38#define FF_PROFILE_SKIP -100
39//#endif
40/* Foxconn modify end, Bernie 06/01/2016 */
41
42#if LIBAVCODEC_VERSION_MAJOR < 53
43#define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO
44#define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
45#endif
46
47#if LIBAVCODEC_VERSION_INT <= ((51<<16)+(50<<8)+1)
48#define CODEC_ID_WMAPRO CODEC_ID_NONE
49#endif
50
51#if LIBAVCODEC_VERSION_MAJOR < 55
52#define AV_CODEC_ID_AAC CODEC_ID_AAC
53#define AV_CODEC_ID_AC3 CODEC_ID_AC3
54#define AV_CODEC_ID_ADPCM_IMA_QT CODEC_ID_ADPCM_IMA_QT
55#define AV_CODEC_ID_AMR_NB CODEC_ID_AMR_NB
56#define AV_CODEC_ID_DTS CODEC_ID_DTS
57#define AV_CODEC_ID_H264 CODEC_ID_H264
58#define AV_CODEC_ID_MP2 CODEC_ID_MP2
59#define AV_CODEC_ID_MP3 CODEC_ID_MP3
60#define AV_CODEC_ID_MPEG1VIDEO CODEC_ID_MPEG1VIDEO
61#define AV_CODEC_ID_MPEG2VIDEO CODEC_ID_MPEG2VIDEO
62#define AV_CODEC_ID_MPEG4 CODEC_ID_MPEG4
63#define AV_CODEC_ID_MSMPEG4V3 CODEC_ID_MSMPEG4V3
64#define AV_CODEC_ID_PCM_S16LE CODEC_ID_PCM_S16LE
65#define AV_CODEC_ID_VC1 CODEC_ID_VC1
66#define AV_CODEC_ID_WMAPRO CODEC_ID_WMAPRO
67#define AV_CODEC_ID_WMAV1 CODEC_ID_WMAV1
68#define AV_CODEC_ID_WMAV2 CODEC_ID_WMAV2
69#define AV_CODEC_ID_WMV3 CODEC_ID_WMV3
70#endif
71
72#if LIBAVUTIL_VERSION_INT < ((50<<16)+(13<<8)+0)
73#define av_strerror(x, y, z) snprintf(y, z, "%d", x)
74#endif
75
76#if LIBAVFORMAT_VERSION_INT >= ((52<<16)+(31<<8)+0)
77# if LIBAVUTIL_VERSION_INT < ((51<<16)+(5<<8)+0) && !defined(FF_API_OLD_METADATA2)
78#define AV_DICT_IGNORE_SUFFIX AV_METADATA_IGNORE_SUFFIX
79#define av_dict_get av_metadata_get
80typedef AVMetadataTag AVDictionaryEntry;
81# endif
82#endif
83
84static inline int
85lav_open(AVFormatContext **ctx, const char *filename)
86{
87	int ret;
88#if LIBAVFORMAT_VERSION_INT >= ((53<<16)+(17<<8)+0)
89	ret = avformat_open_input(ctx, filename, NULL, NULL);
90	if (ret == 0)
91		avformat_find_stream_info(*ctx, NULL);
92#else
93	ret = av_open_input_file(ctx, filename, NULL, 0, NULL);
94	if (ret == 0)
95		av_find_stream_info(*ctx);
96#endif
97	return ret;
98}
99
100static inline void
101lav_close(AVFormatContext *ctx)
102{
103#if LIBAVFORMAT_VERSION_INT >= ((53<<16)+(17<<8)+0)
104	avformat_close_input(&ctx);
105#else
106	av_close_input_file(ctx);
107#endif
108}
109
110static inline int
111lav_get_fps(AVStream *s)
112{
113#if LIBAVCODEC_VERSION_MAJOR < 54
114	if (s->r_frame_rate.den)
115		return s->r_frame_rate.num / s->r_frame_rate.den;
116#else
117	if (s->avg_frame_rate.den)
118		return s->avg_frame_rate.num / s->avg_frame_rate.den;
119#endif
120	return 0;
121}
122
123static inline int
124lav_get_interlaced(AVCodecContext *vc, AVStream *s)
125{
126#if LIBAVCODEC_VERSION_MAJOR < 54
127	return (vc->time_base.den ? (s->r_frame_rate.num / vc->time_base.den) : 0);
128#else
129	return (vc->time_base.den ? (s->avg_frame_rate.num / vc->time_base.den) : 0);
130#endif
131}
132
133static inline int
134lav_is_thumbnail_stream(AVStream *s, uint8_t **data, int *size)
135{
136#if LIBAVFORMAT_VERSION_INT >= ((54<<16)+(6<<8))
137	if (s->disposition & AV_DISPOSITION_ATTACHED_PIC &&
138	    s->codec->codec_id == AV_CODEC_ID_MJPEG)
139	{
140		if (data)
141			*data = s->attached_pic.data;
142		if (size)
143			*size = s->attached_pic.size;
144		return 1;
145	}
146#endif
147	return 0;
148}
149