15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains an implementation of an H.264 Decoded Picture Buffer 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// used in H264 decoders. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_COMMON_GPU_MEDIA_H264_DPB_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_COMMON_GPU_MEDIA_H264_DPB_H_ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/filters/h264_parser.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A picture (a frame or a field) in the H.264 spec sense. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See spec at http://www.itu.int/rec/T-REC-H.264 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct H264Picture { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Field { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FIELD_NONE, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FIELD_TOP, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FIELD_BOTTOM, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Values calculated per H.264 specification or taken from slice header. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See spec for more details on each (some names have been converted from 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CamelCase in spec to Chromium-style names). 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int top_field_order_cnt; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bottom_field_order_cnt; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pic_order_cnt; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pic_order_cnt_msb; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pic_order_cnt_lsb; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pic_num; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int long_term_pic_num; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int frame_num; // from slice header 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int frame_num_offset; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int frame_num_wrap; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int long_term_frame_idx; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch media::H264SliceHeader::Type type; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool idr; // IDR picture? 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ref; // reference picture? 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool long_term; // long term reference picture? 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool outputted; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does memory management op 5 needs to be executed after this 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // picture has finished decoding? 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool mem_mgmt_5; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Field field; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Values from slice_hdr to be used during reference marking and 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // memory management after finishing this picture. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool long_term_reference_flag; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool adaptive_ref_pic_marking_mode_flag; 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::H264DecRefPicMarking 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ref_pic_marking[media::H264SliceHeader::kRefListSize]; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<H264Picture*> PtrVector; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DPB - Decoded Picture Buffer. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Stores decoded pictures that will be used for future display 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and/or reference. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class H264DPB { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) H264DPB(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~H264DPB(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_max_num_pics(size_t max_num_pics); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t max_num_pics() { return max_num_pics_; } 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Remove unused (not reference and already outputted) pictures from DPB 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // and free it. 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void DeleteUnused(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Remove a picture by its pic_order_cnt and free it. 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void DeleteByPOC(int poc); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear DPB. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Clear(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Store picture in DPB. DPB takes ownership of its resources. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StorePic(H264Picture* pic); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the number of reference pictures in DPB. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int CountRefPics(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mark all pictures in DPB as unused for reference. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MarkAllUnusedForRef(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return a short-term reference picture by its pic_num. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) H264Picture* GetShortRefPicByPicNum(int pic_num); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return a long-term reference picture by its long_term_pic_num. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) H264Picture* GetLongRefPicByLongTermPicNum(int pic_num); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the short reference picture with lowest frame_num. Used for sliding 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window memory management. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) H264Picture* GetLowestFrameNumWrapShortRefPic(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Append all pictures that have not been outputted yet to the passed |out| 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // vector, sorted by lowest pic_order_cnt (in output order). 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetNotOutputtedPicsAppending(H264Picture::PtrVector& out); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Append all short term reference pictures to the passed |out| vector. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetShortTermRefPicsAppending(H264Picture::PtrVector& out); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Append all long term reference pictures to the passed |out| vector. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetLongTermRefPicsAppending(H264Picture::PtrVector& out); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators for direct access to DPB contents. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Will be invalidated after any of Remove* calls. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ScopedVector<H264Picture> Pictures; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pictures::iterator begin() { return pics_.begin(); } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pictures::iterator end() { return pics_.end(); } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pictures::reverse_iterator rbegin() { return pics_.rbegin(); } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pictures::reverse_iterator rend() { return pics_.rend(); } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size() const { return pics_.size(); } 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsFull() const { return pics_.size() == max_num_pics_; } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Per H264 spec, increase to 32 if interlaced video is supported. 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum { kDPBMaxSize = 16, }; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pictures pics_; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t max_num_pics_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(H264DPB); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_COMMON_GPU_MEDIA_H264_DPB_H_ 139