You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	Merge commit '77b2cd7b41d7ec8008b6fac753c04f77824c514c'
* commit '77b2cd7b41d7ec8008b6fac753c04f77824c514c': AVFrame: add side data. Conflicts: libavutil/frame.h Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
		| @@ -20,6 +20,7 @@ | ||||
| #include "audioconvert.h" | ||||
| #include "buffer.h" | ||||
| #include "common.h" | ||||
| #include "dict.h" | ||||
| #include "frame.h" | ||||
| #include "imgutils.h" | ||||
| #include "mem.h" | ||||
| @@ -289,6 +290,13 @@ void av_frame_unref(AVFrame *frame) | ||||
| { | ||||
|     int i; | ||||
|  | ||||
|     for (i = 0; i < frame->nb_side_data; i++) { | ||||
|         av_freep(&frame->side_data[i]->data); | ||||
|         av_dict_free(&frame->side_data[i]->metadata); | ||||
|         av_freep(&frame->side_data[i]); | ||||
|     } | ||||
|     av_freep(&frame->side_data); | ||||
|  | ||||
|     for (i = 0; i < FF_ARRAY_ELEMS(frame->buf); i++) | ||||
|         av_buffer_unref(&frame->buf[i]); | ||||
|     for (i = 0; i < frame->nb_extended_buf; i++) | ||||
| @@ -369,6 +377,8 @@ int av_frame_make_writable(AVFrame *frame) | ||||
|  | ||||
| int av_frame_copy_props(AVFrame *dst, const AVFrame *src) | ||||
| { | ||||
|     int i; | ||||
|  | ||||
|     dst->key_frame           = src->key_frame; | ||||
|     dst->pict_type           = src->pict_type; | ||||
|     dst->sample_aspect_ratio = src->sample_aspect_ratio; | ||||
| @@ -383,6 +393,23 @@ int av_frame_copy_props(AVFrame *dst, const AVFrame *src) | ||||
|     dst->coded_picture_number = src->coded_picture_number; | ||||
|     dst->display_picture_number = src->display_picture_number; | ||||
|  | ||||
|     for (i = 0; i < src->nb_side_data; i++) { | ||||
|         const AVFrameSideData *sd_src = src->side_data[i]; | ||||
|         AVFrameSideData *sd_dst = av_frame_new_side_data(dst, sd_src->type, | ||||
|                                                          sd_src->size); | ||||
|         if (!sd_dst) { | ||||
|             for (i = 0; i < dst->nb_side_data; i++) { | ||||
|                 av_freep(&dst->side_data[i]->data); | ||||
|                 av_freep(&dst->side_data[i]); | ||||
|                 av_dict_free(&dst->side_data[i]->metadata); | ||||
|             } | ||||
|             av_freep(&dst->side_data); | ||||
|             return AVERROR(ENOMEM); | ||||
|         } | ||||
|         memcpy(sd_dst->data, sd_src->data, sd_src->size); | ||||
|         av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0); | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| @@ -415,3 +442,48 @@ AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane) | ||||
|     } | ||||
|     return NULL; | ||||
| } | ||||
|  | ||||
| AVFrameSideData *av_frame_new_side_data(AVFrame *frame, | ||||
|                                         enum AVFrameSideDataType type, | ||||
|                                         int size) | ||||
| { | ||||
|     AVFrameSideData *ret, **tmp; | ||||
|  | ||||
|     if (frame->nb_side_data > INT_MAX / sizeof(*frame->side_data) - 1) | ||||
|         return NULL; | ||||
|  | ||||
|     tmp = av_realloc(frame->side_data, | ||||
|                      (frame->nb_side_data + 1) * sizeof(*frame->side_data)); | ||||
|     if (!tmp) | ||||
|         return NULL; | ||||
|     frame->side_data = tmp; | ||||
|  | ||||
|     ret = av_mallocz(sizeof(*ret)); | ||||
|     if (!ret) | ||||
|         return NULL; | ||||
|  | ||||
|     ret->data = av_malloc(size); | ||||
|     if (!ret->data) { | ||||
|         av_freep(&ret); | ||||
|         return NULL; | ||||
|     } | ||||
|  | ||||
|     ret->size = size; | ||||
|     ret->type = type; | ||||
|  | ||||
|     frame->side_data[frame->nb_side_data++] = ret; | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| AVFrameSideData *av_frame_get_side_data(AVFrame *frame, | ||||
|                                         enum AVFrameSideDataType type) | ||||
| { | ||||
|     int i; | ||||
|  | ||||
|     for (i = 0; i < frame->nb_side_data; i++) { | ||||
|         if (frame->side_data[i]->type == type) | ||||
|             return frame->side_data[i]; | ||||
|     } | ||||
|     return NULL; | ||||
| } | ||||
|   | ||||
| @@ -26,9 +26,23 @@ | ||||
|  | ||||
| #include "avutil.h" | ||||
| #include "buffer.h" | ||||
| #include "dict.h" | ||||
| #include "rational.h" | ||||
| #include "samplefmt.h" | ||||
|  | ||||
| enum AVFrameSideDataType { | ||||
|     /** | ||||
|      * The data is the AVPanScan struct defined in libavcodec. | ||||
|      */ | ||||
|     AV_FRAME_DATA_PANSCAN, | ||||
| }; | ||||
|  | ||||
| typedef struct AVFrameSideData { | ||||
|     enum AVFrameSideDataType type; | ||||
|     uint8_t *data; | ||||
|     int      size; | ||||
|     AVDictionary *metadata; | ||||
| } AVFrameSideData; | ||||
|  | ||||
| /** | ||||
|  * This structure describes decoded (raw) audio or video data. | ||||
| @@ -310,6 +324,9 @@ typedef struct AVFrame { | ||||
|      */ | ||||
|     int        nb_extended_buf; | ||||
|  | ||||
|     AVFrameSideData **side_data; | ||||
|     int            nb_side_data; | ||||
|  | ||||
|     /** | ||||
|      * frame timestamp estimated using various heuristics, in stream time base | ||||
|      * Code outside libavcodec should access this field using: | ||||
| @@ -510,6 +527,7 @@ int av_frame_make_writable(AVFrame *frame); | ||||
|  * Metadata for the purpose of this function are those fields that do not affect | ||||
|  * the data layout in the buffers.  E.g. pts, sample rate (for audio) or sample | ||||
|  * aspect ratio (for video), but not width/height or channel layout. | ||||
|  * Side data is also copied. | ||||
|  */ | ||||
| int av_frame_copy_props(AVFrame *dst, const AVFrame *src); | ||||
|  | ||||
| @@ -523,4 +541,24 @@ int av_frame_copy_props(AVFrame *dst, const AVFrame *src); | ||||
|  */ | ||||
| AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane); | ||||
|  | ||||
| /** | ||||
|  * Add a new side data to a frame. | ||||
|  * | ||||
|  * @param frame a frame to which the side data should be added | ||||
|  * @param type type of the added side data | ||||
|  * @param size size of the side data | ||||
|  * | ||||
|  * @return newly added side data on success, NULL on error | ||||
|  */ | ||||
| AVFrameSideData *av_frame_new_side_data(AVFrame *frame, | ||||
|                                         enum AVFrameSideDataType type, | ||||
|                                         int size); | ||||
|  | ||||
| /** | ||||
|  * @return a pointer to the side data of a given type on success, NULL if there | ||||
|  * is no side data with such type in this frame. | ||||
|  */ | ||||
| AVFrameSideData *av_frame_get_side_data(AVFrame *frame, | ||||
|                                         enum AVFrameSideDataType type); | ||||
|  | ||||
| #endif /* AVUTIL_FRAME_H */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user